Что означает:: mean в С++?
void weight_data::rev_seq(string &seq){
//TODO
std::reverse(seq.begin(), seq.end());
}
В этом методе С++ я думаю, что этот метод ничего не возвращает, поэтому префикс void
, что ::
указывает отношения между weight_data
и rev_seq(string &seq)
? Спасибо!
Ответы
Ответ 1
void
- тип возвращаемого значения. ::
- это оператор разрешения области, поэтому он означает, что rev_seq
находится внутри области weight_data
. weight_data
может быть либо пространством имен, либо классом (в зависимости от того, что вы дали, невозможно сказать, какой).
Ответ 2
В С++,
-
A::B
означает, что B
является идентификатором в пределах namespace
или class
типа A
,
-
A.B
означает, что B
является членом типа struct
, class
или union
, экземпляр которого упоминается объектом или ссылкой A
, и
-
A->B
означает, что B
является членом типа struct
, class
или union
, экземпляр которого указан указателем A
. (Это эквивалентно (*A).B
.)
В некоторых других языках все три случая охватываются только .
.
Обратите внимание, что в С++ функция-член не обязательно должна быть реализована (определена) в определении класса. (Если они есть, они неявно inline
.) Они могут быть и часто выполняются в отдельных файлах реализации (.cpp
). Это имеет то преимущество, что не все пользователи класса должны перекомпилировать, когда вы меняете реализацию одной из функций-членов класса. Поэтому, если weight_data
- это имя namespace
, void weight_data::rev_seq(string &seq) {...}
- такое определение члена класса вне его класса.
Ответ 3
weight_data
является namespace или именем класса.
Ответ 4
Строка void weight_data::rev_seq(string &seq)
сообщает компилятору, что это определение функции члена rev_seq(string &seq)
из weight_data
. Если бы это только что сказанное void rev_seq(string &seq) { ... }
, компилятор подумал бы, что определенная функция нечлена, в отличие от функции-члена rev_seq(string &seq)
класса weight_data
.
class weight_data
{
void rev_str(string &seq);
}
Это также означает, что rev_str
относится к функции, которая является частью пространства имен weight_data
.
namespace weight_data
{
void rev_str(string &seq);
}
Ответ 5
Просто подумал о добавлении еще двух интересных вещей о::
a) Оператор:: является и унарным, и двоичным оператором
struct A{
int m;
};
int x;
int main(){
::x; // Unary
int (A::*p) = &A::m; // Binary
}
b) $10.3/12 - "Явная квалификация с оператором области (5.1) подавляет механизм виртуального вызова".
struct A{
virtual void f(){cout << 1;}
};
struct B : A{
void f(){cout << 2;}
};
int x;
int main(){
B b;
A &ra = b;
ra.f(); // dynamic binding, prints 2
ra.A::f(); // suppress VF mechanism, prints 1.
}