为什么静态变量需要在c++中声明两次?

Why do static variables need to be declared twice in C++

本文关键字:两次 声明 变量 静态 c++ 为什么      更新时间:2023-10-16

我有一个名为filepaths.h的头文件,它定义了一些静态变量:

#ifndef FILEPATHS_H
#define FILEPATHS_H
class FilePaths {
public:
    static QString dataFolder();
    static QString profileFolder();
private:
    static QString dataFolder_;
    static QString profileFolder_;
};
}
#endif // FILEPATHS_H

我有一个相关联的filepaths。cpp它最初看起来像这样:

#include "FilePaths.h"
QString FilePaths::dataFolder() {
    return dataFolder_;
}
QString FilePaths::profileFolder() {
    return profileFolder_;
}

然而,这没有工作-我得到了一个"未解析的符号错误"链接器错误在所有的静态变量。因此,我以这种方式将这些变量添加到c++文件中:

#include "FilePaths.h"
QString FilePaths::dataFolder_ = "";
QString FilePaths::profileFolder_ = "";
QString FilePaths::dataFolder() {
    return dataFolder_;
}
QString FilePaths::profileFolder() {
    return profileFolder_;
}

这是有效的,但我不明白为什么。

为什么这些静态变量需要定义两次?或者我不是定义它们,而是初始化它们?但是为什么要这么做呢?或者我应该用不同的方式写我的类吗?

一个是定义,另一个是声明。不同之处在于声明可以出现多次,对于不在类中的变量,可能永远不会出现,而定义只能出现一次。

需要单独声明和定义的原因是古老的历史,这种事情基本上根本不必这样做,但这样做是为了使c++与C兼容,C是在20世纪70年代被设计为编译的。

From http://weblogs.asp.net/whaggard/archive/2004/11/05/252685.aspx:

你需要在类外部声明它,否则编译器不知道该成员应该去哪个翻译单元(因此是对象文件)。

因为,就像DeadMG说的,你可以多次声明一个变量,但只定义它一次。我认为这就像函数原型一样:你可以有尽可能多的函数原型,但只有一个可以与主体一起使用并实际定义函数。

您不需要声明它们两次,声明发生在类头文件中,而定义(变量实际存在并将分配一些内存的点)在.cpp部分中。

但是与普通实例变量的区别在于,对于您创建的任何实例,每个类的静态部分只存在一次。

这是因为,当你声明一个类时,你是在为该类的特定实例声明一个结构,但是在类中的静态变量的情况下,它们是可以在创建类的任何对象之前初始化的。当我们在内存中声明一个类时,没有空间保留,但是当我们声明类的对象时,空间是保留的。类的任何成员都不能像这样初始化int = 2;但这可以像'static int a=2;'一样实现在类声明中,在第二个声明&必须意识到这一点