web-dev-qa-db-ja.com

ローカルスコープ内のグローバル変数にアクセスするにはどうすればよいですか?

これは私のコードです

#include <iostream>
using namespace std;
int x = 5;
int main()
{
    int x = 1;
    cout << "The variable x: " << x << endl;
}   

出力として得ます1、しかし私は5、グローバルx変数へのアクセスと同様。

これは可能ですか?

23
user3080728

ローカルスコープのグローバル変数にアクセスするには、::xを使用する必要があります。演算子::は、単項スコープ解決演算子です。したがって、コードは次のようになります。

   #include <iostream>
   using namespace std;
   int x = 5;
   int main()
   {
       int x = 1;
       cout << "The variable x: " << ::x << endl;
   }   

注:::演算子には、C++では2つの意味があります。

  1. バイナリスコープ解決演算子。
  2. 単項スコープ解決演算子。

ほとんどコーディング時間全体にわたって、Binaryスコープ解決演算子を使用します。したがって、この質問に対する答えは単項スコープ解決演算子ですが、将来の参照のために、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つのオペランドに作用します。

  1. クラス名
  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;
}
34
KodingKid