如果静态成员未初始化并且成员类型本身是类,该怎么办?
一类的定义如下:如果静态成员未初始化并且成员类型本身是类,该怎么办?
class Singleton {
public:
static Singleton instance_;
private:
Singleton() {
cout << "constructor\n";
}
};
在一个函数:
Singleton instance = Singleton::instance_;
代码可以被编译和被抛出任何错误。如果我这样使用它:
Singleton &instance = Singleton::instance_;
引发链接错误。我想知道为什么第一个案例可以正确编译?我知道构造函数没有被调用。第一种情况下实例的对象状态是什么?第一个案件是否有意义?
这两种形式都是代码中的错误,但在这两种情况下,编译器/链接器都可以默默忽略错误,因此不需要检测它们。
Singleton instance = Singleton::instance_;
使用隐式生成的拷贝构造函数。它复制Singleton::instance_
中的所有0个非静态数据成员,因此可能完全被优化。因此,没有定义的情况下使用Singleton::instance_
的事实可能会被忽视。
Singleton &instance = Singleton::instance_;
绑定到Singleton::instance_
并要求知道其地址。因此,如果Singleton::instance_
未定义,则更可能导致错误。
你可以提供的Singleton::instance_
定义的方法是
Singleton Singleton::instance_;
在文件范围内。
当类定义时,静态成员只有声明为。它们必须在类定义之外定义。在你的情况,你应该写:
类辛格尔顿{
这主要是用来当你需要不平凡的建设,但如果你忘了定义静态成员,但简单并不存在,则在运行时得到链接错误或未定义的行为。
谢谢。我只是想知道为什么可以编译第一个案例。我认为它不能。 – CppLucifer
点击!如果我定义我的拷贝构造函数而不是使用默认的构造函数,那么代码就不能编译。看起来编译器在优化之后确实忽略了错误。 – CppLucifer