Rac*_*hel 13 c++ pointers dereference
性能之间或其他方面是否有任何差异:
ptr->a();
Run Code Online (Sandbox Code Playgroud)
和
(*ptr).a();
Run Code Online (Sandbox Code Playgroud)
?
Ita*_*man 15
[编辑]
如果变量定义为T*(其中T是某种类型),那么 - >和*都是相同的(除非ptr为null).
如果变量是类的实例(通过值或通过引用),那么 - >和*应该表现相同(按照最佳实践),但这要求类以相同的方式重载它们.
Luc*_*cas 12
因为你在评论中要求它.您可能正在寻找的内容可以在标准(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;
}
Run Code Online (Sandbox Code Playgroud)
但请注意,这不会编译:
cout << objCHandle->x << endl;
Run Code Online (Sandbox Code Playgroud)
因为 - >的向下钻取行为仅在表达式的左侧是类,结构,联合或泛型类型时发生.在这种情况下,objCHandle是一个MyClass**,所以它没有资格.