初始化列表
来源:互联网 发布:java web简单小项目 编辑:程序博客网 时间:2024/06/07 10:45
一:为什么使用初始化列表比较高效?
答:因为在初始化列表中对成员变量初始化,是直接调用成员变量的拷贝构造函数对其初始化;
而在构造函数体内对成员变量初始化;是先在进入函数之前调用成员变量自身的默认构造函数,创建一个真正成员变量对象,然后在函数体内调用成员变量对象的赋值运算符重载函数,给对象赋值;
代码:
#include<iostream>using namespace std;class Time{public: Time()//默认构造函数 { cout<<"time的默认构造函数"<<endl; _hour=0; _min=0; _second=0; } Time(const Time& t)//拷贝构造函数 { cout<<"time的拷贝构造函数"<<endl; _hour=t._hour; _min=t._min; _second=t._second; } Time& operator=(const Time &t)//赋值运算符重载 { cout<<"time的赋值运算符重载"<<endl; if (this!=&t) { _hour=t._hour; _min=t._min; _second=t._second; } return *this; }public: int _hour; int _min; int _second;};class Date{public: //在函数体内初始化 Date(int year,int month,int day,const Time& t) { cout<<"data的构造函数"<<endl; _day=day; _month=month; _year=year; _t=t; } //在初始化列表初始化 Date(int year,int month,int day,const Time& t) :_year(year) ,_month(month) ,_day(day) ,_t(t) { cout<<"data的构造函数"<<endl; }public: int _year; int _month; ![int _day;](http://img.blog.csdn.net/20170509164036360?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ29nb2dvX3NreQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) Time _t;};int main(){ Time t; Date d1(2007,6,7,t); return 0;}
运行结果:
//在函数体内初始化
//在初始化列表初始化
二、必须在初始化列表中初始化的成员变量:
(1)常量成员变量(常量创建时必须初始化)
(2)引用类型成员变量(引用创建时必须初始化)
(3)没有缺省函数类型的成员变量;
解释(3):默认构造函数又叫缺省构造函数,缺省构造函数包括无参构造函数和全缺省构造函数;
当一个类没有缺省构造函数时,此时这个类的对象作为另一个类的成员变量,当没有对这个成员变量
在初始化列表中初始化时,这个成员变量会先调用自身默认构造函数创建真正的对象,然后在函数内调用自己的赋值运算符对自己赋值;
三、初始化列表初始化成员变量的顺序
在初始化列表中,成员变量按照声明的顺序依次初始化,而不按照初始化列表的出现的顺序
代码:
#include<iostream>using namespace std;class Date{public: Date(int x) :_day(x) ,_month(_day) ,_year(_month) {} void Printf() { cout<<_year<<"-"<<_month<<"-"<<_day<<endl; }private: int _year; int _month; int _day;};int main(){ Date d(3); d.Printf(); return 0;}
结果:
0 0
- 初始化列表
- 初始化列表
- 初始化列表
- 初始化列表
- 初始化列表
- 初始化列表
- 初始化列表
- 初始化列表
- 初始化列表
- 初始化列表
- 初始化列表
- 初始化列表
- 初始化列表
- 列表初始化
- 初始化列表
- 初始化列表
- 初始化列表
- 列表初始化
- IO模型 阻塞 非阻塞 同步 异步概念对比区分
- Chapter12——编写一个程序,求面积和
- Array Partition I问题及解法
- 利用rsyslog对非系统日志进行远程传输
- ubantu 删除掉的文件回收站里没有
- 初始化列表
- 结合mysqlbinlog与mysqldump进行MySQL数据备份与恢复(适用于较小的数据量)
- Android 新建文件夹、生成文件并向文件写入文本内容
- Android OkHttp3简介和使用详解
- MyCat1.6带返回参数存储过程调用示例
- iOS导航栏自定义按钮导致点击范围过大的问题
- android5.1 增加ethernet设置(DHCP与Static ip)
- 网络管理
- 用mysqldump备份及结合binlog日志恢复的全过程