c++ 类成员变量初始化

首先,说说类成员变量的书写位置:定义类的成员变量必须先写在.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,通过自定义方法进行初始化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值