关于初始化列表在构造函数章节也有过介绍,参考C++57个入门知识点_31 初始化列表及派生类中的函数隐藏(初始化列表:用于调用父类有参构造并初始化、用于自身成员初始化、对于常量成员初始化;函数隐藏:不同作用域里两个数据名称相同,由内向外隐藏)
初始化列表总结:
1. 可以用于初始化普通成员变量/常成员变量
2. 通常是用来构造有参数的成员对象
1. 初始化列表用于初始化普通成员变量/常成员变量
上篇C++57个入门知识点_40 常成员函数(用于定义不可修改内部变量的函数,一般用来修饰Get的函数;常成员函数this指针:const T* const;常成员函数内部变量修改方法:强转/关键字)学习了const
修饰成员函数,还有一个地方没讲到,那就是const也可以修饰成员变量,称为 常成员变量
,在声明时就需要初始化,并且一旦定义就不能修改。
- 对于常成员变量,在高版本的编译器中采用如下形式进行初始化是没有问题的。
const int m_nTest=1; //在低级编译器中此句是无法编译通过的,高级的是可以的
整体代码:
class CInteger
{
public:
CInteger(int nNumber) {
m_nNumber = nNumber;
}
int GetNumber() const;
void SetNumber(int nNumber) {
m_nNumber = nNumber;
}
private:
int m_nNumber;
const int m_nTest=1;
};
- 对于
低版本的编译器
,就需要利用在构造函数的初始化列表来进行初始化,采用初始化列表初始化
方法如下:
class CInteger
{
public:
CInteger(int nNumber):
m_nTest(1),
m_nNumber(456),
{
m_nNumber = nNumber;
}
int GetNumber() const;
void SetNumber(int nNumber) {
m_nNumber = nNumber;
}
private:
int m_nNumber;
const int m_nTest;
};
2. 初始化列表用于成员对象的初始化
初始化列表也可以用于类中成员对象的初始化
。前面也讲过成员对象的概念,参考C++57个入门知识点_30 父子类,成员类构造析构顺序(存在父子和成员类的构造析构:构造:父类->成员类->自己;析构:自己->成员类->父类;成员类:A类对象作为B类成员,A为B成员类或朋友类)
代码如下:
class CTest {
public:
CTest(int n,int m) {
m_n = n;
m_m = m;
}
private:
int m_n;
int m_m;
};
class CInteger
{
public:
CInteger(int nNumber):
m_nTest(1),
m_nNumber(456),
m_t(1,2)
{
m_nNumber = nNumber;
}
int GetNumber() const;
void SetNumber(int nNumber) {
m_nNumber = nNumber;
}
private:
//CTest中存在参数,如果不进行初始化就无法进行默认的构造
//单个参数可以采用CTest m_t=1;的形式初始化
//多个参数在初始列表中采用m_t(1,2)的形式
CTest m_t;//成员对象
int m_nNumber;//如果想要在常成员函数内修改成员使用mutable int m_nNumber
//const int m_nTest=1; //在低级编译器中此句是无法编译通过的,高级的是可以的
const int m_nTest;
};
3.学习视频地址:常成员变量及初始化列表