[英]C++ - Difference between (*). and ->?
之間的性能-或其他方面是否有差異:
ptr->a();
和
(*ptr).a();
?
[編輯]
如果將變量定義為T *(其中T是某種類型),則->和*都相同(除非ptr為null)。
如果變量是類的實例(按值或引用),則->和*的行為應相同(按照最佳實踐),但這需要類以相同的方式重載它們。
由於您在評論中要求它。 您可能會在標准(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 **,因此不符合條件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.