static
// example.h#include <vector>
class Example {
public:
static constexpr double rate = 6.5;
static const int vecSize = 20;为什么这里没有定义,是它已经定义了,还是就没有定义?如果定义了他在哪?
static std::vector<double> vec;
};
// example.cpp
#include "example.h"
constexpr double Example::rate;为什么这里需要定义?
std::vector<double> Example::vec(Example::vecSize);
难道只有整型的才不需要外部定义初始化吗? 在C++中,静态成员变量的定义和初始化有一些特殊的规则。
对于整型的静态成员变量,如果在类定义中使用了常量表达式进行初始化,那么该静态成员变量就被视为已经定义了。在这种情况下,我们只需要在类定义外部提供一个定义即可,如示例中的 constexpr double Example::rate; 语句。
对于其他类型的静态成员变量,无论是否使用了常量表达式进行初始化,都需要在类定义外部提供一个定义。这是因为其他类型的静态成员变量需要分配内存空间,并且初始化的过程可能需要更多的操作,因此需要提供定义。
在示例中, vecSize 是一个整型静态成员变量,它在类定义中使用了常量表达式进行初始化,所以它被视为已经定义了。而 vec 是一个 std::vector<double> 类型的静态成员变量,所以需要在类定义外部进行定义和初始化。
总结起来,只有整型的静态成员变量在类定义中使用常量表达式进行初始化时,才被视为已经定义了,其他类型的静态成员变量都需要在类定义外部提供定义和初始化。 在C++中,static关键字在类中的使用有特殊的含义。当我们在类中声明一个静态成员时,它实际上只是在类的范围内声明了一个全局变量,但并没有定义它。这就是为什么我们需要在类的外部定义它。
对于constexpr和const的静态成员,情况有所不同。对于constexpr,它是在编译时就已经确定的,所以它不需要在类的外部再次定义。而对于const的整型静态成员,C++标准允许在类内部初始化,因此也不需要在类的外部定义。但是,对于非整型的const静态成员或者非const的静态成员(如std::vector<double> vec),它们需要在类的外部定义和初始化。
所以,对于你的问题:
1. static constexpr double rate = 6.5; 这里的rate已经在类内部定义和初始化了,所以不需要在类的外部再次定义。在你的代码中,constexpr double Example::rate;这行代码是多余的,可以删除。
2. static const int vecSize = 20; 这里的vecSize也已经在类内部定义和初始化了,所以不需要在类的外部再次定义。
3. static std::vector<double> vec; 这里的vec只是在类内部声明了,没有定义和初始化,所以需要在类的外部定义和初始化,即std::vector<double> Example::vec(Example::vecSize);。
总的来说,不是只有整型的才不需要外部定义初始化,而是constexpr和const的整型静态成员可以在类内部定义和初始化,而非整型的const静态成员或者非const的静态成员需要在类的外部定义和初始化。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
页:
[1]