簡體   English   中英

C ++-(*)之間的差異。 和->?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM