上に示したコードはクラスを定義していますが、最初はメンバー関数のみを宣言しています (その後すぐに定義しています)。用語は効果的なコミュニケーションにとって重要であるため、これについてのみ言及します。
クラス メンバーをインラインで定義する場合は、スコープ解決 operator ::
を使用しません。次に例を示します。
class cls {
void hello() { cout << "Hello world"; }
};
それらを個別に定義する場合は、それが必要です。そうしないと、コンパイラーは定義しようとしている関数を正確に認識できないためです。
class cls {
void hello();
};
void cls::hello() { cout << "Hello world"; };
一般に、スコープ解決演算子の使用は名前空間の操作に限定されません。コンパイラに完全修飾名を提供する必要がある場合はいつでも使用します。
ほとんどの場合、クラス スコープ内からクラス メンバーにアクセスする場合、非修飾名を使用できます。コンパイラはそれらを独自に解決します。たとえば、コードでは、これらはすべて同等です。
x++;
cls::x++;
this->x++;
this->cls::x++; // yes, this too
同じ名前のメンバーが複数あり、コンパイラーが修飾されていない名前を意図したメンバー以外の名前に解決する場合は常に、名前を修飾する必要があります。例:
void cls::foo(int x) {
x++; // increments the argument
cls::x++; // increments the member
this->x++; // also increments the member
}
cls
から派生する可能性がありbase
、 をbase
定義する可能性があることも考慮してくださいx
。その場合、次のように機能します。
void cls::foo() {
x++; // increments foo::x
cls::x++; // increments foo::x
base::x++; // increments base::x
}