首先,说说类成员变量的书写位置:定义类的成员变量必须先写在.h文件中,如果希望初始化,那就在.cpp文件中进行初始化。
注意:
静态变量,如欲初始化,必须在cpp文件内使用 类名::变量名称 的方式初始化。
非静态变量如在.h文件内定以后,如不欲初始化,那么可不在.cpp文件内重新定义,如欲初始化,那么可在.cpp文件内直接使用。例如:
在.h文件中:
class R { public r();int R1,R2;static int R3 } ;
在.cpp文件中:
R::R3 = 10; R1 = 11,;R2 = 12;
其次,介绍一下不同成员变量的初始化规则与方法:
A,在介绍不同成员的初始化方法之前,先说说c++为类成员初始化的过程:
1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员
2.进入构造函数后在构造函数中执行一般计算
1.类里面的任何成员变量在定义时是不能初始化的。注意这点
2.一般的数据成员可以在构造函数中初始化。
3.const数据成员必须在构造函数的初始化列表中初始化。
4.static要在类的定义外面初始化。
5.数组成员是不能在初始化列表里初始化的。
6.不能给数组指定明显的初始化。
B,我在初始化变量的时候遇到的问题:
.h文件内定义的内容:
const int i;
int ii;
string jkey;
static std::string s_jkey;
const static std::string c_s_jkey1;
const std::string c_jkey;
.cpp文件内容:
string jkey = "jkey"; //错误,这句的意思是重新定义一个全局变量jkey;如果是在某方法内,是正确的;
string atpkeylib_tool::s_jkey = "s_jkey"; //静态变量必须使用 类名:: 的方式进行初始化,初始化结果有效。
const string atpkeylib_tool::c_s_jkey1="c_s_jkey1"; //const必须在类声明内初始化,初始化结果有效。
const string c_jkey ="11"; //错误,这句的意思是重新定义一个全局变量c_jkey。
int ii =100;
//下面是构造函数,无初始化列表得情况下
atpkeylib_tool::atpkeylib_tool(){}
Main函数调用内容:
atpkeylib_tool at; //定义对象
cout<<"|"<<at.jKey<<"|"<<atpkeylib_tool::s_jKey<<"|"<<atpkeylib_tool::c_s_jkey1<<"|"<<at.c_j
eky<<"|"<<at.i<<"|"<<at.ii<<endl; //输出变量结果。
结果为:常量i没有初始化。
调试:变更构造函数: atpkeylib_tool::atpkeylib_tool():i(10)
结果为:||s_jkey|c_s_jkey1||10|0。
奇怪:为什么jkey 与 c_jkey 以及 ii的值都是空或者0呢?
分析与结论:在对象创建的时候,并没有将非static变量进行初始化,我们必须用其他办法进行非static变量的初始化。
下面统一总结一下,静态,非静态变量的初始化方法:
1,静态,非常量:基础数据类型或自定义对象包含
a,不在cpp文件内初始化,编译并不会出现错误。
b,在cpp文件内,直接 std::string avatar_tool::str = "test";的方式进行初始化。
2,静态,常量:基础数据类型或自定义对象包含
a,必须在cpp文件内,直接 std::string avatar_tool::str = "test";的方式进行初始化。如不再cpp文件内初始化,将出现编译错误。
3,非静态,常量:基础数据类型或自定义对象包含
a,只能通过构造函数的初始化列表进行初始化:例如:
.h文件内:
const std::string c_str;
const int i ;
那么cpp文件内的构造函数就必须为:atpkeylib_tool::atpkeylib_tool():i(10),c_str("like"){}
如果不初始化,编译将出错。
-----------------------------------------------------------------------------------------------------------------------
4,非常量,非静态变量的初始化:基础数据类型或自定义对象包含
a,通过构造函数内进行初始化;(不初始化,编译不报错)
b,通过初始化列表进行初始化;(不初始化,编译不报错)
c,通过自定义方法进行初始化。