为什么 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 对象是一个静态对象,它会一直存在到应用程序结束,所以如果这是你的意图,这种模式是好的,并且在一些评论中也提到过,它被称为单例模式。
#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 对象是一个静态对象,它会一直存在到应用程序结束,所以如果这是你的意图,这种模式是好的,并且在一些评论中也提到过,它被称为单例模式。