2016-09-11 40 views
0

考慮以下代碼運算符在下面的代碼中的重載如何工作?

// Example program 
#include <iostream> 
#include <string> 

class SmartPtr{ 
    int *ptr; 
    public: 
    explicit SmartPtr(int *ptr=0){ 
     ptr = new int; 
    } 
    ~SmartPtr(){ 
     std::cout<<"Dest is called"<<std::endl;} 
    int& operator *() //overloaded operator for dereferencing 
    { 
    std::cout<<"(*) is called .."<<std::endl; 
    return *ptr; 
    } 

    int * operator ->() //overloaded operator for referencing 
    { 
     std::cout<<"(*) is called .."<<std::endl; 
     return ptr; 
     } 
}; 

int main() 
{ 

    SmartPtr p(new int()); 
    *p = 20; //overloaded operator * called 
    std::cout<<*p<<std::endl; // Overloaded operator * called 
    // End of program 
    //Destructor called 

} 

這裏我重載運算符*和&,我想知道爲什麼基於我以前在主函數中提到的意見該類型的函數簽名的。 如果有人可以解釋它是如何工作的?

PS:我是新來的C++和交代我問是微不足道{我知道:)}

+0

「這裏我重載了運算符*和&」 - 等待,*你重載了這些運算符,但不知道你編寫的代碼是如何工作的? – WhozCraig

+0

它的複製代碼@WhozCraig我想通過一種方式來理解這段代碼我自己可以實現這樣的事情 –

+0

顯然與你的問題無關然後,這個代碼最大的問題可能是缺少實際初始化或分配, 'ptr',成員變量,在該構造函數中。在構造函數中'ptr = ...'正在修改參數自動變量; * member *'ptr'保持默認初始化(以確定值)。當完成後,'main'中的'p.ptr'不確定,並且'new int'都被泄漏,因此在你用'operator *'解引用時嘗試存儲一個值,並調用*未定義的行爲* 。 – WhozCraig

回答

1

這是智能指針構造方式。 它們是任何類的指針的包裝,它們通過在智能指針超出範圍時自動調用它們的析構函數來控制這些對象的釋放。 爲了公開包裝類的接口,它們必須重載*和 - >運算符並返回包裝對象的指針。

1

在C++中,您可以將函數定義爲運算符在您的類型上的行爲。這正是發生在這裏的事情。

int& operator *()聲明該函數,即用於一元運算符*。然後該運算符的結果是對int的引用。

int* operator ->()然後聲明->的功能。這個有點特別,因爲它會再次用於返回值,直到有一個指針,它將用於應用->的標準行爲。

聲明瞭這些運算符後,編譯器將在您的類型的任何對象上接受它們。你可以再寫*myObj去得到operator *()函數的結果。

此功能爲您提供擴展部分語言的功能。請注意,可以根據需要選擇返回類型。如果你看一下實現特定領域語言的高級庫,你會發現很多。 Boost :: spirit是一個極端的例子。

相關問題