Что означает:: 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.
}