C ++のClassName ClassName変数の定義がコンパイルおよび正常に動作するのはなぜですか?
-
06-07-2019 - |
質問
クラス定義があるとします:
class CustomClass {
int member;
};
次の変数定義が正しくコンパイルおよび動作する理由:
CustomClass CustomClass; // the variable is properly constructed
これはコンパイラを混乱させ、エラーを示すべきではありませんか?
解決
クラス名と変数名は、2つの別個の名前空間を占有します。コンパイラは、最初の CustomClass
が型であり、2番目の CustomClass
が変数名であることを把握できます。
他のヒント
要求された疑いは、必ずしもC ++の大文字と小文字を区別するモードに関するものではなく、上で定義したクラスと同じ名前を持つ変数宣言です。あなたのC ++コンパイラは、それが解析しているトークンのタイプを推測するのに十分スマートであると考えています..
私は、コンパイラのマジックがそれを機能させると考えています。これは理想的にはコンパイラーエラーであることに同意します(少なくとも私を混乱させます)。
次のようなものを試す場合
#include <iostream>
class Test { public: int member; };
Test Test; // comaeu warns 'expression has no effect!'
Test.member = 10; // dosen't compile!
int main(){
Test Test;
Test.member = 10; // compiles fine after global 'Test's are commented!!
std::cout<<Test.member<<std::endl;
return 0;
}
グローバルスコープでの 'Test.member'の使用はコンパイルされませんが、両方のグローバル 'Test'がコメント化された後、 'main()'内で同じ動作をします。
C ++には、プログラマを興奮させるのに十分な複雑さがあります。コンパイラがあまりにも貢献しているのはどうですか:-)?
これ回答は、C ++でこれを行うことができる主な理由を間接的に述べています。 Cとの後方互換性に帰着します。Cでは、型の名前空間が異なるため、型とオブジェクト、または同じ名前の型と関数を宣言できました。
Cとの互換性を保つために、C ++はオブジェクトまたは関数が型の宣言を隠すことを許可する特別な規則を追加しました。
確かに、なぜですか? では、クラスCustomClassを再度定義する方法を教えてください。 簡単:次のようにキーワード&quot; class&quot;を使用します。 クラス; class CustomClass CustomClassAgain;