c++ - 为什么静态成员需要在类外初始化

标签 c++ static

<分区>

#include "stdafx.h"
#include <iostream>

class X { 
public:
    static int n; 
}; 
int X::n;  // out-of-class initialization 

int _tmain(int argc, _TCHAR* argv[])
{
    X x;
    std::cout << x.n << std::endl;
    return 0;
}

如果没有类外初始化,将会出现 Unresolved external 链接器错误。

但这是什么原因呢?类声明将其指定为静态成员,我什至没有分配值 n:

int X::n;

当我打印它时,n 的值为 0。所以它是默认初始化的。

如果是这样,那么需要什么以及为什么编译器不能仅从类声明进行默认初始化?编译器明明可以看到类X有一个static int成员n,为什么要定义在类外呢?

谢谢。

最佳答案

你所说的初始化实际上是一个定义

原因是定义只能一次是一个translation unit .

如果静态成员变量是在头文件中定义的,它可以被多次定义,从而打破one definition rule。 .

或者编译器不知道将定义放入哪个翻译单元,因为它对其他可能的翻译单元一无所知。

关于c++ - 为什么静态成员需要在类外初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51645533/

相关文章:

c++ - 如何将 "\"用作字符串中的文本而非命令

ios - 3D Touch 静态快捷键

c - 简单 C 代码块的错误输出

java - 如何在 Java 中创建(实际上是)指针

c++ - 不同构造函数的命令行参数

c++ - Dlib r_squared C2059 错误

c++ - 接口(interface)开销

C++ 对象表示

android - 清除静态数据 onDestroy()

c - 静态链接错误