个人主页 :阿然成长日记 点击可跳转
个人专栏: 数据结构与算法C语言进阶C++
不能则学,不知则问,耻于问人,决无长进
如下代码
class A {
//成员函数
private:
int _a;
int _b;
//const修饰的变量
const int _t
};
会出现如下结果
声明
,还没有在内存中为其开辟出一块空间以供存放,真正开出空间则是在定义
的时候,那何时定义呢?也就是使用这个类A去实例化出对象的时候。为了解决这个问题,祖师爷就提出了初始化列表
。
解决方法一: 给缺省值
使用C++11里面为内置类型不初始化打了一个补丁,在声明的位置给到一个初始化值,就可以很好地防止编译器不处理的问题。
const int _t = 1;
方法二: 使用初始化列表
接下来就开始初始化列表的学习!
概念:在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。
class Date
{
public:
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式
就拿之前写过的日期类为例
class Date
{
public:
Date(int year, int month, int day)
:_year(year)
, _month(month)
, _day(day)
{}
private:
int _year;
int _month;
int _day;
};
int main(void)
{
Date d(2023, 3, 30);
return 0;
}
class A {
//成员函数
public :
A()
:_t(888)
{}
private:
int _a = 666;
int _b = 999;
//const修饰的变量
const int _t;
};
int main()
{
A a;
return 0;
}
class A {
//成员函数
public :
A()
:_a(444)
,_t(888)
{}
private:
int _a = 666;
int _b = 999;
//const修饰的变量
const int _t;
};
int main()
{
A a;
return 0;
}
1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
2. 类中包含以下成员,必须放在初始化列表位置进行初始化
(1) 引用成员变量
通过编译可以看出,这个引用型成员变量_z需要被初始化,它必须要引用一个值
(2) const成员变量
这个在前面已经说到过了,const修饰的成员变量和构造函数对于内置类型不做处理产生了一个冲突,因此祖师爷就提出了【初始化列表】这个概念
(3) 自定义类型成员
写了有参构造编译器就不会提供默认构造。也就是说当存在自定义类型的时候,我们还是尽量使用初始化列表,
3.尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。
4. 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关