C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のスコープ解決演算子(::)とは?使い方と具体例をわかりやすく解説


::(スコープ解決)演算子は、変数のスコープによって隠れてしまった名前へアクセスし、引き続き利用できるようにするための演算子です。この演算子は、単項演算子としても二項演算子としても使用できます。

ブロックやクラス内で、同じ名前を持つ別の宣言によって名前空間スコープやグローバルスコープの名前が隠されている場合には、単項のスコープ解決演算子が役立ちます。例えば、my_varという名前のグローバル変数と、同名のローカル変数が存在する場合、グローバル側のmy_varにアクセスするにはスコープ解決演算子を使う必要があります。

使用例1:グローバル変数へのアクセス

#include <iostream>
using namespace std;

int my_var = 0;
int main(void) {
    int my_var = 0;
    ::my_var = 1;   // グローバルの my_var に 1 を代入
    my_var = 2;     // ローカルの my_var に 2 を代入
    cout << ::my_var << ", " << my_var;
    return 0;
}

出力結果

実行すると以下のように表示されます。

1, 2

main関数内で宣言されたmy_varは、グローバル名前空間スコープで宣言された同名の整数型変数を隠しています。そのため、通常のmy_var = 2;という文ではローカル変数が操作されます。一方、::my_var = 1;のように先頭に::を付けることで、グローバル名前空間スコープで宣言されたmy_varへ明示的にアクセスできるのです。

また、スコープ解決演算子はクラス名やクラスメンバー名に対しても使用できます。クラスメンバーの名前が隠されている場合でも、「クラス名::メンバー名」という形式でアクセス可能です。次の例を見てみましょう。

使用例2:クラスの静的メンバーへのアクセス

#include <iostream>
using namespace std;
class X {
    public:
    static int count;
};
int X::count = 10;   // 静的データメンバーの定義

int main () {
    int X = 0;   // クラス型 X を隠す
    cout << X::count << endl;   // クラス X の静的メンバーを使用
}

出力結果

実行すると以下のように表示されます。

10

この例では、main関数内のローカル変数Xがクラス型Xを隠していますが、X::countと記述することで、クラスXの静的メンバーcountに正しくアクセスできています。このように、スコープ解決演算子を活用すれば、名前の衝突が起きても目的の変数やメンバーに確実にアクセスできます。

  1. C#のスコープ解決演算子(::)とは?名前空間エイリアスの使い方を実例で解説

    スコープ解決演算子(::)とはC#におけるスコープ解決演算子「::」は、C++の同名の演算子とは役割が大きく異なります。C++では「::」はグローバル変数やクラスの静的メンバーへのアクセスに用いられますが、C#では主に名前空間エイリアスを修飾するために使用されます。なぜスコープ解決演算子が必要なのか異なる名前空間に同じ識別子を持つ型が存在する場合、どちらの型を参照したいのかを明示する必要があります。このようなときにスコープ解決演算子を使うことで、参照先の曖昧さを解消できます。たとえば、標準の System.Console クラスを確実に参照したい場合は、global名前空間エイリアスと組み合わ

  2. C#のスコープ解決演算子(::)の使い方と活用シーンを徹底解説

    C#におけるスコープ解決演算子(::)とはC++では、スコープ解決演算子「::」はグローバル変数へのアクセスなどに使われますが、C#では主に名前空間(namespace)に関連して使用される点が大きな違いです。具体的には、異なる名前空間に同じ識別子(クラス名など)が存在し、名前が衝突している場合に、どちらの型を参照するのかを明確に指定するために使います。globalエイリアスとの組み合わせ代表的な使用例として、global::System.Console のように、グローバル名前空間エイリアスと組み合わせて System.Console クラスを参照する方法があります。この書き方をすれば、仮に