性能之间是否有任何差异 - 或者其他 - :
ptr->a();
和
(*ptr).a();
答案 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 **,所以它没有资格。