前言
初始化列表是对构造函数内容的补充,小编会详细的讲解初始化列表的概念,特性,注意点。这是本篇内容的重头戏,小编会先提一个问题来抛砖引玉。
隐式类型转换顾名思义,首先它不需要主动转换,然后就是不同类型之间的转换。
如果把在类成员前面加上static关键字会发生什么,小编也会详细讲解。
对于友元,小编会解析它的概念和用法
小编希望这篇文章能带给大家启发,相互探讨其中的奥秘。本篇内容如有不足之处,还请指正,小编会虚心接受并及时改进质量。
初始化列表
问题引导
因为初始化列表是构造函数的一部分,小编专门写了一篇构造函数供大家参考。
【C++】详解构造函数:http://t.csdnimg.cn/KuDZd
小编先抛给大家一个问题,有如下代码
class Time
{
public:
Time(int huor, int miunte, int second) //Time类的带参构造函数
{
_huor = huor;
_minute = miunte;
_second = second;
cout << "Time带参数构造" << endl;
}
private:
int _huor; //时
int _minute; //分
int _second; //秒
};
class Date
{
public:
private:
int _year; //年
int _month; //月
int _day; //日
Time _t; //时间类的对象
};
上述代码中, 定义了一个时间类Time和日期类Date。 时间类中定义了带参的构造函数 ,日期类并没有显式定义构造函数。时间类的对象_t是日期类的成员变量。那么,上述代码中有什么错误吗?
会在实例化日期类对象的时候报错。
这个报错有点抽象。造成这样报错的原因是:Date类在实例化对象时,系统会生成Date类默认的构造函数,该函数对内置类型不做处理,对自定义类型(_t)会调用该类型的默认构造函数,但我们并没有显式定义Time类的默认构造函数,而且Time类中有带参数的构造函数,所以系统也不会自动生成Time类的默认构造函数。
画图帮大家理解一下
上述问题的核心是:要么Time类没有显式的定义默认构造函数,要么不能通过Date类给Time类中的带参构造函数传参,导致自定义成员变量_t不能完成初始化。
如果在Time类中显式定义默认构造函数,这个问题自然就解决了。那我们能不能通过传参来解决呢?
至此,就要请出本篇的第一个重点:初始化列表
概念引导
在实例化对象对象时,编译器会调用构造函数给给成员变量赋一个初始值。此时,编译器的行为叫不叫初始化呢?答案是不叫。此时编译器的行为叫赋初值,就是给该成员变量一个值。因为初始化只能初始化一次,而构造函数体内可以多次赋值。
写法
写法:冒号开头,逗号分隔,中间是成员变量,成员变量后跟括号,括号里给初始值或表达式
位置:构造函数的函数名和函数体之间
图像示例