これは私のコードです
#include <iostream>
using namespace std;
int x = 5;
int main()
{
int x = 1;
cout << "The variable x: " << x << endl;
}
出力として得ます1
、しかし私は5
、グローバルx
変数へのアクセスと同様。
これは可能ですか?
ローカルスコープのグローバル変数にアクセスするには、::x
を使用する必要があります。演算子::
は、単項スコープ解決演算子です。したがって、コードは次のようになります。
#include <iostream>
using namespace std;
int x = 5;
int main()
{
int x = 1;
cout << "The variable x: " << ::x << endl;
}
注:::
演算子には、C++では2つの意味があります。
ほとんどコーディング時間全体にわたって、Binaryスコープ解決演算子を使用します。したがって、この質問に対する答えは単項スコープ解決演算子ですが、将来の参照のために、Binaryスコープ解決演算子の一般的な使用例をいくつか紹介します。
1。クラス外で関数を定義するには
コードを。h拡張子のヘッダーファイルと。cpp拡張。コードファイルで関数を定義するときに、::
Binaryスコープ解決演算子を使用します。
たとえば、Car.hファイルは次のようになります。
class Car
{
private:
int model;
int price;
public:
void drive();
void accelerate();
};
そしてCar.cppは次のようになります:
void Car :: drive()
{
// Driving logic.
}
void Car :: accelerate()
{
// Logic for accelerating.
}
ここでは、簡単に気付くように、::
は2つのオペランドに作用します。
したがって、基本的には関数のスコープを定義します。つまり、関数drive()belongsclass車に.
2。異なるクラスから派生した同じテンプレートを持つ2つの関数間のあいまいさを解決するため。
次のコードを検討してください。
#include <iostream>
using namespace std;
class Vehicle
{
public:
void drive()
{
cout << "I am driving a Vehicle.\n";
}
};
class Car
{
public:
void drive()
{
cout << "I am driving a Car.\n";
}
};
class BMW : public Car, public Vehicle
{
// BMW specific functions.
};
int main(int arc, char **argv)
{
BMW b;
b.drive(); // This will give compile error as the call is ambiguous.
b.Car::drive(); // Will call Car's drive method.
b.Vehicle::drive(); // Will call Vehicle's drive method.
}
BMWクラスの派生関数は両方とも同じテンプレートを持っているので、b.drive
を呼び出すとコンパイルエラーが発生します。したがって、必要なdrive()を指定するには、::
演算子を使用します。
。オーバーライドされた関数をオーバーライドします。
バイナリスコープ解決演算子は、派生クラスのオブジェクトを使用して派生クラスでオーバーライドされる基本クラスの関数を呼び出すのに役立ちます。以下のコードを参照してください:
#include <iostream>
using namespace std;
class Car
{
public:
void drive()
{
cout << "I am driving Car.\n";
}
};
class BMW : public Car
{
public:
void drive()
{
cout << "I am driving BMW\n";
}
};
int main(int argc, char** argv)
{
BMW b;
b.drive(); // Will call BMW's drive function.
b.Car::drive(); // Will call Car's drive function.
}
4。静的データメンバーにアクセスするには。
ご存知のように、静的データメンバーは、クラスごとにそのクラスのオブジェクトによって共有されます。したがって、オブジェクトを使用して静的変数のスコープを設定することはできません(可能ですが)。次のコードを参照してください。
#include <iostream>
using namespace std;
class Car
{
public:
static int car_variable;
};
int Car :: car_variable;
int main(int argc, char** argv)
{
Car :: car_variable = 10;
cout << "Car variable: " << Car :: car_variable << '\n';
return 0;
}