13

パフォーマンスに違いはありますか?それ以外の場合は、次の間に違いがありますか?

ptr->a();

(*ptr).a(); 

4

3 に答える 3

15

[編集]

変数が T* (T は何らかの型) として定義されている場合、-> と * はどちらも同じです (ptr が null でない限り)。

変数が (値または参照による) クラスのインスタンスである場合、 -> と * は (ベスト プラクティスに従って) 同じように動作する必要がありますが、これには、クラスがそれらを同じ方法でオーバーロードする必要があります。

于 2010-03-18T13:54:09.013 に答える
12

コメントでお願いしているので。あなたがおそらく探しているものは、標準(5.2.5クラスメンバーアクセス)で見つけることができます:

3 E1のタイプが「クラスXへのポインター」の場合、式E1-> E2は同等の形式(*(E1))に変換されます。E2;

コンパイラはまったく同じ命令を生成し、同じように効率的です。「->」と「*」のどちらを書いたかは、マシンにはわかりません。

于 2010-03-18T15:05:38.780 に答える
7

この->演算子は、ほとんどの場合、式の結果がオーバーロードされた -> 演算子が定義されたものでなくなるまで、再帰的に「ドリルダウン」するという点で特別です。式は、部分式で 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** であるため、資格がありません。

于 2010-03-18T14:32:48.717 に答える