在性能或其他方面,以下两者是否有任何区别:
ptr->a();
和
(*ptr).a();
?
既然您在评论中提到了这个问题,那么您可能正在寻找的内容可以在标准文档(5.2.5类成员访问)中找到:
3 如果 E1 的类型是“指向类 X 的指针”,那么表达式 E1->E2 将被转换为等效形式 (*(E1)).E2;
编译器将生成完全相同的指令,并且效率也不会受到影响。您的计算机不知道您是使用“->”还是“*.”来进行操作。
->
运算符在大多数情况下是特殊的,因为它会递归地“向下钻取”,直到表达式的结果不再是为其定义了重载 ->
运算符的内容。而 (*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**,因此不符合条件。
->
或*
,那么它应该同时重载两者,以便仍然保持相同。否则,它的设计不好。 - Tadeusz Kopec for Ukraine