パフォーマンスに違いはありますか?それ以外の場合は、次の間に違いがありますか?
ptr->a();
と
(*ptr).a();
?
[編集]
変数が T* (T は何らかの型) として定義されている場合、-> と * はどちらも同じです (ptr が null でない限り)。
変数が (値または参照による) クラスのインスタンスである場合、 -> と * は (ベスト プラクティスに従って) 同じように動作する必要がありますが、これには、クラスがそれらを同じ方法でオーバーロードする必要があります。
コメントでお願いしているので。あなたがおそらく探しているものは、標準(5.2.5クラスメンバーアクセス)で見つけることができます:
3 E1のタイプが「クラスXへのポインター」の場合、式E1-> E2は同等の形式(*(E1))に変換されます。E2;
コンパイラはまったく同じ命令を生成し、同じように効率的です。「->」と「*」のどちらを書いたかは、マシンにはわかりません。
この->
演算子は、ほとんどの場合、式の結果がオーバーロードされた -> 演算子が定義されたものでなくなるまで、再帰的に「ドリルダウン」するという点で特別です。式は、部分式で 1 つの(*subxpression).x
逆参照のみを行うため、 の結果(*subexpression)
が別のポインターである場合、これはコンパイルされません ( を記述する必要があります(*(*subexpression)).x
。より良い例については、次のコードを参照してください。
#include <iostream>
using namespace std;
class MyClass
{
public:
MyClass() : x(0) {}
int x;
};
class MyPtr
{
private:
MyClass* mObj;
public:
MyPtr(MyClass* obj) : mObj(obj) {}
MyClass* operator->()
{
return mObj;
}
};
int main()
{
MyClass obj;
MyClass* objCPtr = &obj;
MyClass** objCHandle = &objCPtr;
MyPtr ptr(&obj);
cout << ptr->x << endl;
cout << (*(*objCHandle)).x << endl;
}
ただし、これはコンパイルされないことに注意してください。
cout << objCHandle->x << endl;
-> のドリル ダウン動作は、式の左側がクラス、構造体、共用体、またはジェネリック型の場合にのみ発生するためです。この場合、objCHandle は MyClass** であるため、資格がありません。