13

之间的性能或其他方面是否有任何差异:

ptr->a();

(*ptr).a(); 

?

4

3 回答 3

15

[编辑]

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

如果变量是类的实例(按值或按引用),则 -> 和 * 的行为应该相同(根据最佳实践),但这需要类以相同的方式重载它们。

于 2010-03-18T13:54:09.013 回答
12

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

3 如果 E1 的类型为“指向 X 类的指针”,则表达式 E1->E2 被转换为等价形式 (*(E1)).E2;

编译器将产生完全相同的指令,并且同样高效。你的机器不会知道你写的是“->”还是“*.”。

于 2010-03-18T15:05:38.780 回答
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;

因为 -> 的向下钻取行为仅在表达式的左侧是类、结构、联合或泛型类型时发生。在这种情况下,objCHandle 是一个 MyClass**,所以它不符合条件。

于 2010-03-18T14:32:48.717 回答