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

C++のスコープ解決演算子(::)とthisポインタの違いをわかりやすく解説

C++プログラミングにおいて、スコープ解決演算子(::)はクラスの静的メンバーやクラスメンバーにアクセスするために使用され、一方thisポインタは、ローカル変数が同じ名前のメンバー変数を隠してしまう場合に、オブジェクト自身のメンバーにアクセスするために使用されます。

この記事では、それぞれの使い方をサンプルコードと実行結果付きで詳しく解説します。

スコープ解決演算子(::)とは

スコープ解決演算子「::」は、クラス名や名前空間を明示的に指定することで、特定のスコープに属するメンバーへ直接アクセスできる演算子です。特に静的メンバー(staticメンバー)へのアクセスや、ローカル変数によって隠されたクラスメンバーへのアクセスに役立ちます。

サンプルコード

#include<iostream>
using namespace std;

class AB {
    static int x;
public:
    // ローカル引数 'x' がクラスメンバー 'x' を隠すが、
    // 「::」を使えばアクセス可能
    void print(int x) {
        cout << "the number is:" << AB::x;
    }
};

// C++ではstaticメンバーは以下のように明示的に定義が必要
int AB::x = 7;

int main() {
    AB ob;
    int m = 6;
    ob.print(m);
    return 0;
}

実行結果

the number is:7

この例では、print関数の引数xがクラスの静的メンバーxを隠していますが、AB::xと記述することで、正しく静的メンバーの値「7」を出力できています。

thisポインタとは

thisポインタは、メンバー関数内で「その関数を呼び出したオブジェクト自身」を指す特殊なポインタです。引数などのローカル変数がメンバー変数と同じ名前の場合、通常はローカル変数が優先されますが、this->を付けることでオブジェクトのメンバー変数に確実にアクセスできます。

サンプルコード

#include<iostream>
using namespace std;

class AB {
    int x;
public:
    AB() {
        x = 6;
    }
    // ここでもローカル引数 'x' がオブジェクトのメンバー 'x' を隠すが、
    // thisポインタを使えばアクセス可能
    void print(int x) {
        cout << "the number is: " << this->x;
    }
};

int main() {
    AB ob;
    int m = 7;
    ob.print(m);
    return 0;
}

実行結果

the number is: 6

この例では、コンストラクタで初期化されたメンバー変数xの値「6」が、this->xによって正しく出力されています。引数x(値は7)ではなく、オブジェクト自身のメンバーが参照されている点に注目してください。

両者の違いまとめ

項目スコープ解決演算子(::)thisポインタ
主な用途静的メンバーやクラスメンバーへのアクセス呼び出し元オブジェクトのメンバーへのアクセス
対象クラス全体に属するメンバー個々のオブジェクトのメンバー
使用場面staticメンバー定義、名前の衝突時引数とメンバー変数名が衝突したとき

まとめ

スコープ解決演算子(::)はクラスレベルのメンバーにアクセスするための手段であり、thisポインタはオブジェクトレベルのメンバーにアクセスするための手段です。特に、引数名とメンバー変数名が同じ場合にどちらを使うべきかを理解しておくと、意図しないバグを防ぎ、より安全で読みやすいC++コードを書くことができます。

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

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

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

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