为什么 return 类型的 getInstance 方法应该是 return 引用?

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;
}

为什么 return 类型的 getInstance 方法应该是 return 引用?

如果 return 类型的 getInstance 方法的值是 return,我会遇到以下错误。

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

why return type of getInstance method should be return by reference?

因为析构函数是私有的,正如诊断消息所指出的那样。当析构函数是私有的时,不能在 class 范围之外创建临时对象。如果您调用一个 returns 纯右值的函数并丢弃该值,将创建一个临时对象。

您已将问题标记为 [单例]。单例是 class 其中只有一个对象存在。如果你的函数 returns 每次调用一个新对象,那么它就不会是一个单例。

再补充几点:

return 类型不必是引用,但由于 class 的析构函数是私有的,因此任何函数(不是这个特定的函数) ) return 那个类型的对象不能 return 实际对象。

这是因为调用者无法复制该对象。当按值传递时,将创建对象的副本,然后 return 返回(对此有更多优化,但这是最简单的想法)。然后调用者在对象超出范围时销毁该对象,如果它是私有的,则调用者不能。

关于 return 引用的另一个快速说明,当您 return 引用时,调用者不对对象的生命周期负责。如果您销毁 returned 对象,在调用者完成它之前,您可能最终会遇到对未初始化(销毁)内存的访问冲突。在你的例子中,这是不可能的,因为 returned 对象是一个静态对象,它会一直存在到应用程序结束,所以如果这是你的意图,这种模式是好的,并且在一些评论中也提到过,它被称为单例模式。