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

【C++入門】スコープ解決演算子(::)とthisポインタの違いをサンプルコードで徹底解説

この記事では、C++のサンプルコードをいくつか取り上げ、それぞれどのような出力が得られるのかを確認しながら、スコープ解決演算子(::)thisポインタの役割や機能の違いについて理解を深めていきます。

ローカル変数によるメンバ変数の隠蔽(シャドウイング)

あるクラスに「x」というメンバ変数が定義されており、同じ名前「x」を引数として受け取る関数がある状況を考えてみましょう。この関数内で「x」を参照すると、メンバ変数は隠され(シャドウイングされ)、ローカル変数が優先的に使用されます。実際にコードで動作を確認してみましょう。

サンプルコード

#include <iostream>
using namespace std;
class MyClass {
    private:
        int x;
    public:
        MyClass(int y) {
            x = y;
        }
    void myFunction(int x) {
        cout << "Value of x is: " << x;
    }
};
main() {
    MyClass ob1(10);
    ob1.myFunction(40);
}

出力結果

Value of x is: 40

このように、関数の引数として渡されたローカル変数「x」の値(40)が出力され、コンストラクタで設定したメンバ変数の値(10)は参照されていません。これが名前の衝突によるシャドウイング現象です。

thisポインタでメンバ変数にアクセスする

クラスのメンバ変数xにアクセスしたい場合は、thisポインタを使用します。thisポインタとは、現在のオブジェクト自身を指す特殊なポインタです。thisポインタを使うことで、メンバ変数とローカル変数を明確に区別できます。

サンプルコード

#include <iostream>
using namespace std;
class MyClass {
    private:
        int x;
    public:
        MyClass(int y) {
            x = y;
        }
    void myFunction(int x) {
        cout << "Value of x is: " << this->x;
    }
};
main() {
    MyClass ob1(10);
    ob1.myFunction(40);
}

出力結果

Value of x is: 10

今回は「this->x」と記述することで、オブジェクトのメンバ変数の値(10)が正しく出力されました。このように、引数名とメンバ変数名が同じ場合の名前衝突を解決するには、thisポインタが有効です。

スコープ解決演算子(::)の役割

C++には、スコープ解決演算子(::)と呼ばれるもう一つの重要な演算子があります。この演算子は、親クラスのメンバ静的(static)メンバにアクセスするために使用されます。静的メンバはクラスのインスタンスではなくクラスそのものに属するため、thisポインタを使ったアクセスは適切ではありません。静的メンバにはスコープ解決演算子を使ってアクセスするのが正しい方法です。

サンプルコード

#include <iostream>
using namespace std;
class MyClass {
    static int x;
    public:
        void myFunction(int x) {
            cout << "Value of x is: " << MyClass::x;
        }
};
int MyClass::x = 50;
main() {
    MyClass ob1;
    ob1.myFunction(40);
}

出力結果

Value of x is: 50

「MyClass::x」と記述することで、静的メンバ変数の値(50)が正しく出力されました。仮にここでthisポインタを使って静的メンバにアクセスしようとすると、コンパイルエラーや予期しない問題が発生する可能性があります。

まとめ:使い分けのポイント

  • thisポインタ:現在のオブジェクト自身を指すポインタ。非静的なメンバ変数にアクセスする際に使用し、引数とメンバ変数の名前衝突を解決できる。
  • スコープ解決演算子(::):クラス名や名前空間を指定してスコープを明示する演算子。静的メンバや親クラスのメンバへのアクセスに使用する。

両者は似たような場面で登場しますが、対象となるメンバの種類が異なります。非静的メンバにはthisポインタ、静的メンバや親クラスのメンバにはスコープ解決演算子を使う、と覚えておくと良いでしょう。

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

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

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

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