0

このコードがあります:

#include <iostream>

const int c = 3;

struct A {
   static int f() { return c; }
   static const int c = 2;
};

int main() {
   std::cout << A::f() << std::endl; // 2
   return 0;
}

グローバル変数が最初に宣言されているにもかかわらず、クラスcで定義された変数がグローバルスコープで定義された変数の代わりに関数で使用されるのはどうしてですか?Afcc

4

3 に答える 3

1

宣言の順序の問題ではなく、変数のスコープの問題です。使用されている変数は、現在のメソッド/関数で前に検索され、その後、クラス/構造体で検索され、グローバル コンテキストで次のように検索されます。例:

#include <iostream>

const int c = 3;

struct A {
   static void print() { 
      int c = 4
      std::cout <<"Method Scope:"<< c << std::endl; // 4
      std::cout <<"Class/Struct Scope:"<< A::c << std::endl; // 2 here you can use alse ::A::c
      std::cout <<"Global Scope:"<< ::c << std::endl; // 3
   }
   static const int c = 2;
};

struct B {
   static void print() { 
      std::cout <<"Method Scope:"<< c << std::endl; // 2
      std::cout <<"Class/Struct Scope:"<< B::c << std::endl; // 2 here you can use alse ::A::c
      std::cout <<"Global Scope:"<< ::c << std::endl; // 3
   }
   static const int c = 2;
};

struct C {
   static void print() { 
      std::cout <<"Method Scope:"<< c << std::endl; // 3
      //std::cout <<"Class/Struct Scope:"<< C::c << std::endl; //is inpossible ;)
      std::cout <<"Global Scope:"<< ::c << std::endl; // 3
   }
};

int main() {
   A::print();
   B::print();
   C::print();
   return 0;
}
于 2013-05-03T15:43:36.787 に答える
0

多くの変数を使用する長いコードがあると想像してください。代わりに、関数が属するクラスからこれらの変数を呼び出したいですか? 述べる:

aまたb

クラスでの意味

this->a

this->b

グローバル変数を表示したい場合は、次のように使用する必要があります

::aまたは ::bこの関数内で、次を介して:

static int f() { return ::c; }

標準ドキュメントから、Sec 3.3.1

すべての名前は、宣言領域と呼ばれるプログラム テキストの一部で導入されます。宣言領域は、その名前が有効なプログラムの最大の部分です。つまり、その名前は、同じエンティティを参照する非修飾名として使用できます。 . 一般に、それぞれの特定の名前は、スコープと呼ばれるプログラム テキストの不連続な部分内でのみ有効です。宣言のスコープを決定するために、宣言の潜在的なスコープを参照すると便利な場合があります。宣言のスコープは、潜在的なスコープに同じ名前の別の宣言が含まれていない限り、潜在的なスコープと同じです。その場合、宣言の潜在的なスコープ内側の (含まれる) 宣言領域は、外側の (含む) 宣言領域の宣言の範囲から除外されます。

これは、別の (内部) 宣言が発生しない限り、潜在的なスコープが宣言のスコープと同じであることを意味します。発生した場合、外側の宣言の潜在的なスコープが削除され、内側の宣言のみが保持されるため、グローバル変数は非表示になります。

于 2013-05-03T15:36:47.750 に答える