C++中成员变量加上static或const关键字后的分析

C++中类成员变量加上static或const关键字后的初始化问题。在一个简单的C++类中定义如下这些变量:

#include <iostream>using namespace std;class TestVariable{public:TestVariable(){}private:int intVariable;//情况0 不加限定符,这个不需要进行讨论const int constIntVariable;//情况1 const常量static int staticIntVariable;//情况2 静态变量static const int staticConstIntVariable;//情况3 静态常整型类型static const float staticConstNotIntVariable;//情况4 静态非常整型类型};int main(){TestVariable variable;return 0;}加入限定符后多了4中情况,下面就这四种情况分别进行分析。情况1:const修饰

编译上面的代码,首先在情况1处出现问题,在g++中的错误提示是:

在vs中的提示更明显,“error C2758: “TestVariable::constIntVariable”: 必须在构造函数基/成员初始值设定项列表中初始化”。直接给出了解决方法,就是说对于类中的const常量类型而言,需要在构造函数初始化化列表中进行初始化。

#include <iostream>using namespace std;class TestVariable{public:TestVariable()<span style="color:#ff0000;">:constIntVariable(0)</span>{}private:int intVariable;//情况0 不加限定符,这个不需要进行讨论const int constIntVariable;//情况1 const常量static int staticIntVariable;//情况2 静态变量static const int staticConstIntVariable;//情况3 静态常整型类型static const float staticConstNotIntVariable;//情况4 静态非常整型类型};int main(){TestVariable variable;return 0;}这样情况1的问题就解决了。情况2:static修饰

然后编译上面的代码能通过,不过明显还有问题,就是static变量没有初始化化,但是编译时没有出错。原因就是还没有使用到这些变量,因为static变量是类的所有实例共享的,所以在构造variable这个变量时只对constIntVariable这个变量进行了检查,在编译时会出错,但是其余的3个静态变量由于没有使用所有还看不出问题所在。将代码修改成这样来检查情况2中静态变量的问题:

#include <iostream>using namespace std;class TestVariable{public:TestVariable():constIntVariable(0){}<span style="color:#ff0000;">void printStaticInt(){cout<<"staticIntVariable:"<<staticIntVariable<<endl;}</span>private:int intVariable;//情况0 不加限定符,这个不需要进行讨论const int constIntVariable;//情况1 const常量static int staticIntVariable;//情况2 静态变量static const int staticConstIntVariable;//情况3 静态常整型类型static const float staticConstNotIntVariable;//情况4 静态非常整型类型};int main(){TestVariable variable;variable.printStaticInt();return 0;}g++编译时的错误情况如下:

vs中的错误提示为“error LNK2001: 无法解析的外部符号 "private: static int TestVariable::staticIntVariable" (?staticIntVariable@TestVariable@@0HA)”,这种情况下g++中的提示更明显些,就是对TestVariable::staticIntVariable这个变量未定义的引用,所以我们的解决方法就是将它初始化。这个变量的初始化这样操作:

#include <iostream>using namespace std;class TestVariable{public:TestVariable():constIntVariable(0){}void printStaticInt(){cout<<"staticIntVariable:"<<staticIntVariable<<endl;}private:int intVariable;//情况0 不加限定符,这个不需要进行讨论const int constIntVariable;//情况1 const常量static int staticIntVariable;//情况2 静态变量static const int staticConstIntVariable;//情况3 静态常整型类型static const float staticConstNotIntVariable;//情况4 静态非常整型类型};<span style="color:#ff0000;">int TestVariable::staticIntVariable=1;</span>int main(){TestVariable variable;variable.printStaticInt();return 0;}注意int TestVariable::staticIntVariable=1;这行代码不能写成static int TestVariable::staticIntVariable=1;,否则就在g++中会出现这个错误:

而在vs中会出现“error C2720: “TestVariable::staticIntVariable”: 成员上的“static ”存储类说明符非法”这个错误提示。

情况3:static const修饰的整型数据

然后就是情况3和情况4,情况3和情况4中的限定符是一样的,就是static const(这里写成static const和const static好像都可以,最起码在vs和g++中测试都通过了),不同的是数据类型而已,这里int类型是一种特例,就是静态常量整型(short ,int ,long,long long)数据可以在类中初始化,而其他类型都只能在类外面进行初始化。

首先添加调用这个变量的函数:

#include <iostream>using namespace std;class TestVariable{public:TestVariable():constIntVariable(0){}void printStaticInt(){cout<<"staticIntVariable:"<<staticIntVariable<<endl;}<span style="color:#ff0000;">void printStaticConstInt(){cout<<"staticOnstIntVariable:"<<staticConstIntVariable<<endl;}</span>private:int intVariable;//情况0 不加限定符,这个不需要进行讨论const int constIntVariable;//情况1 const常量static int staticIntVariable;//情况2 静态变量static const int staticConstIntVariable;//情况3 静态常整型类型static const float staticConstNotIntVariable;//情况4 静态非常整型类型}; int TestVariable::staticIntVariable=1;int main(){TestVariable variable;variable.printStaticInt();variable.printStaticConstInt();return 0;}在g++中编译的结果为:

无论何时何地,只要创造就有收获,只有不息的奋进,才能证明生命的存在。

C++中成员变量加上static或const关键字后的分析

相关文章:

你感兴趣的文章:

标签云: