C++;静态类成员初始化 我是C++新手,还在学习阶段,所以这可能是一个简单的,也许是愚蠢的问题。(

C++;静态类成员初始化 我是C++新手,还在学习阶段,所以这可能是一个简单的,也许是愚蠢的问题。(,c++,class,static,member,C++,Class,Static,Member,从董事会上的其他问题和答案中,我了解到,在cpp文件中初始化私有静态类数据成员以及其他成员函数定义是一种习惯,而且更可取 但是,是否可以在main.cpp中将成员函数初始化为全局变量?既然所有对象都应该共享一个静态数据成员,为什么不在那里初始化它呢?(我认为应该在main中初始化它,但我猜这会导致编译错误) 请您解释一下,这在技术上是不合理的,还是不是常规的做法。由于静态数据成员在类cpp文件中以全局变量的形式初始化,我看不出在主cpp中初始化它会失败的原因。请建议。假设下面的头文件class.

从董事会上的其他问题和答案中,我了解到,在cpp文件中初始化私有静态类数据成员以及其他成员函数定义是一种习惯,而且更可取

但是,是否可以在main.cpp中将成员函数初始化为全局变量?既然所有对象都应该共享一个静态数据成员,为什么不在那里初始化它呢?(我认为应该在main中初始化它,但我猜这会导致编译错误)


请您解释一下,这在技术上是不合理的,还是不是常规的做法。由于静态数据成员在类cpp文件中以全局变量的形式初始化,我看不出在主cpp中初始化它会失败的原因。请建议。

假设下面的头文件
class.hpp

#pragma once // sort of portable
struct C // to make the example shorter.
{
    static int answer;
};
以及下面的源文件
class.cpp

#include "class.hpp"
// nothing here
#include <iostream>
#include "class.hpp"
int C::answer = 42;
int main()
{
    std::cout << "And the answer is " << C::answer << "." << std::endl;
}
以及以下主源文件
main.cpp

#include "class.hpp"
// nothing here
#include <iostream>
#include "class.hpp"
int C::answer = 42;
int main()
{
    std::cout << "And the answer is " << C::answer << "." << std::endl;
}
执行相同的编译过程会导致链接错误

未解析的外部符号“public:static int C::answer”


因此,回答您的问题。这是可能的。链接器不关心哪个对象文件包含该值的定义(只要它只定义一次)但是,我不建议这样做。

可能的重复项您需要在类外初始化:
int Something::s_nValue=1;
使用静态成员之前要三思,除非它们是常量。您可能遇到的陷阱包括SIOF和竞争条件。后者仅适用于您或其他人想在第使用C++11改进了静态处理,特别是函数静态变量和用于单例习惯用法的其他静态处理。以前,您基本上需要自己对所有内容进行互斥保护,现在编译器可以帮助您。请参阅例如。