void
- тип возвращаемого значения. ::
- это оператор разрешения области, поэтому это означает, что rev_seq
находится внутри области weight_data
. weight_data
может быть либо пространством имен, либо классом (в зависимости от того, что вы указали, невозможно сказать, какой именно).
Строка 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);
}
Просто подумал о добавлении еще двух интересных вещей о ::
а) Оператор :: является и унарным, и бинарным оператором
struct A{
int m;
};
int x;
int main(){
::x; // Unary
int (A::*p) = &A::m; // Binary
}
б) $ 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.
}
В C ++
A :: B
означает, что B
является идентификатором в пространстве имен
или класс
] type A
, AB
означает, что B
является членом struct
, class
или тип union
, на экземпляр которого ссылается объект или ссылка A
, а A-> B
означает, что B
является членом struct
, class
или union
тип, на экземпляр которого ссылается указатель A
. (Это эквивалент (* A) .B
.) В некоторых других языках все три случая покрываются . Только
.
Обратите внимание, что в C ++ функции-члены не обязательно должны быть реализованы (определены) в определении их класса. (Если да, то они неявно встроены
.) Они могут быть и часто реализуются в виде отдельных файлов реализации ( .cpp
). Это имеет то преимущество, что не всем пользователям класса необходимо перекомпилировать при изменении реализации одной из функций-членов класса.Итак, если weight_data
не является namespace
name, void weight_data :: rev_seq (string & seq) {...}
является таким определением члена класса за пределами свой класс.