2017-04-13 55 views
2

一类的定义如下:如果静态成员未初始化并且成员类型本身是类,该怎么办?

class Singleton { 
public: 
    static Singleton instance_; 

private: 
    Singleton() { 
     cout << "constructor\n"; 
    } 
}; 

在一个函数:

Singleton instance = Singleton::instance_; 

代码可以被编译和被抛出任何错误。如果我这样使用它:

Singleton &instance = Singleton::instance_; 

引发链接错误。我想知道为什么第一个案例可以正确编译?我知道构造函数没有被调用。第一种情况下实例的对象状态是什么?第一个案件是否有意义?

回答

2

这两种形式都是代码中的错误,但在这两种情况下,编译器/链接器都可以默默忽略错误,因此不需要检测它们。

Singleton instance = Singleton::instance_;使用隐式生成的拷贝构造函数。它复制Singleton::instance_中的所有0个非静态数据成员,因此可能完全被优化。因此,没有定义的情况下使用Singleton::instance_的事实可能会被忽视。

Singleton &instance = Singleton::instance_;绑定到Singleton::instance_并要求知道其地址。因此,如果Singleton::instance_未定义,则更可能导致错误。

你可以提供的Singleton::instance_定义的方法是

Singleton Singleton::instance_; 

在文件范围内。

+0

点击!如果我定义我的拷贝构造函数而不是使用默认的构造函数,那么代码就不能编译。看起来编译器在优化之后确实忽略了错误。 – CppLucifer

0

当类定义时,静态成员只有声明为。它们必须在类定义之外定义。在你的情况,你应该写:

类辛格尔顿{

​​

这主要是用来当你需要不平凡的建设,但如果你忘了定义静态成员,但简单并不存在,则在运行时得到链接错误或未定义的行为。

+0

谢谢。我只是想知道为什么可以编译第一个案例。我认为它不能。 – CppLucifer