【C++】详解初始化列表,隐式类型转化,类静态成员,友元

前言

初始化列表是对构造函数内容的补充,小编会详细的讲解初始化列表的概念,特性,注意点。这是本篇内容的重头戏,小编会先提一个问题来抛砖引玉。

隐式类型转换顾名思义,首先它不需要主动转换,然后就是不同类型之间的转换。

如果把在类成员前面加上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类中显式定义默认构造函数,这个问题自然就解决了。那我们能不能通过传参来解决呢?

至此,就要请出本篇的第一个重点:初始化列表

概念引导

在实例化对象对象时,编译器会调用构造函数给给成员变量赋一个初始值。此时,编译器的行为叫不叫初始化呢?答案是不叫。此时编译器的行为叫赋初值,就是给该成员变量一个值。因为初始化只能初始化一次,而构造函数体内可以多次赋值。

写法

写法:冒号开头,逗号分隔,中间是成员变量,成员变量后跟括号,括号里给初始值或表达式

位置:构造函数的函数名和函数体之间

图像示例

评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值