簡體   English   中英

為什么 getInstance 方法的返回類型應該通過引用返回?

[英]why return type of getInstance method should be return by reference?

#include<iostream>

using namespace std;

class A{
    private :
        A()
        {
            cout<<"Constructed"<<endl;
        }
        ~A()
        {
            cout<<"Destructed"<<endl;
        }
    public:
        static A& getInstance()
        {
            static A a;
            return a;
        }
};

int main()
{
    A::getInstance();
    return 0;
}

為什么 getInstance 方法的返回類型應該通過引用返回?

如果 getInstance 方法的返回類型是按值返回,我會得到以下錯誤。

.\2.cpp: In function 'int main()':
.\2.cpp:25:20: error: 'A::~A()' is private within this context
   25 |     A::getInstance();
      |                    ^
.\2.cpp:11:9: note: declared private here
   11 |         ~A()
      |         ^

為什么 getInstance 方法的返回類型應該通過引用返回?

因為析構函數是私有的,正如診斷消息所指出的那樣。 當析構函數是私有的時,不能在類的范圍之外創建臨時對象。 如果調用返回純右值的函數並丟棄該值,則會創建一個臨時對象。

您已將問題標記為 [singleton]。 單例是只有一個對象存在的類。 如果您的函數為每次調用返回一個新對象,則它不會是單例。

再補充幾點:

返回類型不一定是引用,但由於您返回的類的析構函數是私有的,任何返回該類型對象的函數(不是這個特定的函數)都不能返回實際對象。

這是因為調用者無法復制該對象。 當按值傳遞時,創建對象的副本並返回(對此有更多優化,但這是最簡單的想法)。 調用者然后在它超出范圍時銷毀該對象,如果它是私有的,則調用者不能。

關於返回引用的另一個快速說明,當您返回引用時,調用者不負責對象的生命周期。 如果在調用者完成之前銷毀返回的對象,則可能會導致對未初始化(銷毀)內存的訪問沖突。 在您的示例中,這是不可能的,因為返回的對象是一個靜態對象,它將一直存在到應用程序結束,所以如果這是您的意圖,這種模式很好,並且正如一些評論中提到的,它被稱為單例圖案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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