C++ this ポインタ

C++ 类 & 对象C++ クラス & オブジェクト

C++ では、thisthisポインタは特殊なポインタであり、現在のオブジェクトのインスタンスを指します。

C++ では、すべてのオブジェクトはthisthis ポインタを使用して自身のアドレスにアクセスできます。

thisこれは隠れたポインタであり、クラスのメンバ関数内で使用でき、呼び出し元のオブジェクトを指すために使用できます。

オブジェクトのメンバ関数が呼び出されると、コンパイラはそのオブジェクトのアドレスを this ポインタとして暗黙的に渡します。

フレンド関数にはthisポインタはありません。フレンドはクラスのメンバではないため、ポインタを持つのはメンバ関数だけです。thisポインタを持ちます。

以下の例は this ポインタの概念をよりよく理解するのに役立ちます:

例

#include <iostream> class MyClass { private: int value; public: void setValue(int value) { this->value = value; } void printValue() { std::cout << "Value: " << this->value << std::endl; } }; int main() { MyClass obj; obj.setValue(42); obj.printValue(); return 0; }

上記のコードを実行すると、出力結果は次のとおりです:

Value: 42

例の解説:

  • 上記の例では、MyClass という名前のクラスを定義しました。このクラスにはプライベートメンバ変数 value があります。

  • クラスの setValue() 関数は value の値を設定するために使用され、printValue() 関数は value の値を出力するために使用されます。

  • setValue() 関数内では、this ポインタを使用して現在のオブジェクトのメンバ変数 value を参照し、渡された値を代入します。これにより、関数パラメータやローカル変数ではなく、現在のオブジェクトのメンバ変数にアクセスしたいことをコンパイラに明確に伝えることができます。

  • printValue() 関数内でも、同様に this ポインタを使用して現在のオブジェクトのメンバ変数 value を参照し、それを出力します。

  • main() 関数では、MyClass のオブジェクト obj を作成し、setValue() 関数を使用して value の値を 42 に設定し、printValue() 関数で出力しています。

  • this ポインタを使用することで、メンバ関数内で現在のオブジェクトのメンバ変数にアクセスできます。たとえそれらが関数パラメータやローカル変数と同じ名前でも、名前の衝突を避け、正しい変数にアクセスしていることを保証できます。

その他の例

以下の例は、直方体の体積を比較するためのものです:

例

#include <iostream> using namespace std; class Box { public: // コンストラクタの定義 Box(double l=2.0, double b=2.0, double h=2.0) { cout <<"コンストラクタを呼び出します。" << endl; length = l; breadth = b; height = h; } double Volume() { return length * breadth * height; } int compare(Box box) { return this->Volume() > box.Volume(); } private: double length; // 幅 double breadth; // 長さ double height; // 高さ }; int main(void) { Box Box1(3.3, 1.2, 1.5); // box1 を宣言 Box Box2(8.5, 6.0, 2.0); // box2 を宣言 if(Box1.compare(Box2)) { cout << "Box2 の体積は Box1 より小さい" <<endl; } else { cout << "Box2 の体積は Box1 以上である" <<endl; } return 0; }

上記のコードをコンパイルして実行すると、次の結果が生成されます:

调用构造函数。
调用构造函数。
Box2 的体积大于或等于 Box1

C++ 类 & 对象C++ クラス & オブジェクト

その他の拡張