如果静态成员未初始化并且成员类型是类本身,该怎么办?

What if a static member is not initialized and the member type is class itself?

本文关键字:怎么办 类型 初始化 静态成员 成员类 成员 如果      更新时间:2023-10-16

类的定义是这样的:

class Singleton {
public:
    static Singleton instance_;
private:
    Singleton() {
        cout << "constructorn";
    }
};

在函数中:

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

在文件范围内。

静态成员仅在定义类时声明。它们必须在类定义之外定义。在您的情况下,您应该写:

类单例 {

public:
    static Singleton instance_; // declare the static member
private:
    Singleton() {
        cout << "constructorn";
    }
};
Singleton Singleton::instance_; // defines the static member

这主要用于需要非平凡构造的情况,但是如果您忘记定义静态成员,则它不存在,并且在运行时会出现链接错误或未定义的行为。