C ++ - (*)之间的差异。和 - >?

时间:2010-03-18 13:52:27

标签: c++ pointers dereference

性能之间是否有任何差异 - 或者其他 - :

ptr->a();

(*ptr).a(); 

3 个答案:

答案 0 :(得分:15)

[编辑]

如果变量定义为T *(其中T是某种类型),那么两者都是 - >和*是相同的(除非ptr为空)。

如果变量是类的实例(按值或按引用),那么 - >和*应该表现相同(按照最佳实践),但这要求类以相同的方式重载它们。

答案 1 :(得分:12)

因为你在评论中要求它。您可能正在寻找的内容可以在标准(5.2.5类成员访问)中找到:

  

3如果E1具有“指向类的指针”类型   X,“那么表达式E1-> E2是   转换为等效形式   (*(E1))E2;

编译器将生成完全相同的指令,它将同样有效。你的机器不会知道你是否写了“ - >”要么 ”*。”。

答案 2 :(得分:7)

->运算符的特殊之处在于,在大多数情况下,它会递归地“向下钻取”,直到表达式的结果不再出现过载 - >运营商为它定义。 (*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;

因为 - &gt;的向下钻取行为仅当表达式的左侧是类,结构,联合或泛型类型时才会发生。在这种情况下,objCHandle是一个MyClass **,所以它没有资格。