c++,初始化列表
类对象的构造顺序是这样的:
a.分配内存,调用构造函数时,隐式/显示的初始化各数据成员
b.进入构造函数后在构造函数中执行一般计算
1.初始化类的成员有两种方式,一是使用初始化列表,二是在构造函数体内进行赋值操作。使用初始化列表主要是基于性能问题. [参考C++ 初始化列表 http://www.cnblogs.com/graphics/archive/2010/07/04/1770900.html。]
对于内置类型,如int, float等,使用初始化类表和在构造函数体内初始化差别不是很大,但是对于类类型来说,最好使用初始化列表,为什么呢?由上面的测试可知,使用初始化列表少了一次调用默认构造函数的过程,这对于数据密集型的类来说,是非常高效的。
2. 除了性能问题之外,有些时场合初始化列表是不可或缺的,以下几种情况时必须使用初始化列表
- 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面
- 引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面
- 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化。
- 如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,而没有默认构造函数,这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,如果没有初始化列表,那么他将无法完成第一步,就会报错。
- 经过试验发现,对于继承的类来说,如果父类没有默认的构造函数,则必须在子类的构造函数中以初始化列表的方式区初始化父类成员,否则报错。
基类:
class Time
{
public:
Time(, )
{
cout<<"A construct"<<endl;
hour = h;
min = m;
sec = s;
}
void show_time()
{
cout<<hour<<":"<<min<<":"<<sec<<endl;
}
int gethour()
{
return hour;
}
int getmin()
{
return min;
}
int getsec()
{
return sec;
}
protected:
int hour;
int min ;
int sec;
};
子类,构造函数声明:
DTime(int h, int m, int s);
DTime(Time &t);
class DTime: public Time
{
public:
DTime(int h, int m, int s);
DTime(Time &t);
void show_time()
{
cout<<date<<"-"<<hour<<":"<<min<<":"<<sec<<endl;
}
void setdate(int d)
{
date = d;
}
private:
int date;
};
定义构造函数时使用初始化列表:
冒号以后跟以逗号隔开的成员初始化列表
基类初始化时注意,基类中必须要定义有相应形式的构造函数,否则报错。
错误示例:
DTime::DTime(Time &t)
:date(2014)//error C2512: “Time”: 没有合适的默认构造函数可用
//若基类中没有默认构造函数,初始化列表中必须以自定义的基类构造函数来初始化基类成员。
{
}
正确示例:
DTime::DTime(int h, int m, int s)//此处同声明一致
:Time(h,m,s)//基类初始化
,date(2014)//成员变量初始化
{
}
DTime::DTime(Time &t)//此处同声明一致
:Time(t.gethour(), t.getmin(),t.getsec()) //基类初始化
,date(2014) //成员初始化
{
}
DTime::DTime(int h, int m, int s)
:Time(h,m,s)
,date()
{
}
DTime::DTime(Time &t)
:Time(t.gethour(), t.getmin(),t.getsec())
,date()
{
}
使用:
int _tmain(int argc, _TCHAR* argv[])
{
Time time();
time.show_time();
Time& t = time;
DTime dtime(t);//此处同声明一致
dtime.show_time();
DTime d_time(,,);//此处同声明一致
d_time.show_time();
system("pause");
;
}
/*
A construct
1:0:0
A construct
2014-1:0:0
A construct
2014-12:24:25
请按任意键继续. . .
*/
参考:
1. C++ 与“类”有关的注意事项总结(十一): 成员初始化列表(★) http://www.cnblogs.com/charley_yang/archive/2011/04/07/2007356.html
2. C++ 初始化列表 http://www.cnblogs.com/graphics/archive/2010/07/04/1770900.html
c++,初始化列表的更多相关文章
- C++中使用初始化列表的情况
http://blog.csdn.net/iceshirley/article/details/5688696 要理解这个问题,从概念上,我们要知道一点,那就是构造函数的执行过程会分成两个阶段:隐式或 ...
- C++11新特性——初始化列表 initializer_list
破事水: 由于最近数据结构有个实验报告说是要对字符串进行排序,想偷个懒不想一个一个地赋值,虽然可以用strcpy和传入二级指针的形式直接写,但是这样感觉不美观漂亮. 然后就去膜了一下C++11的新特性 ...
- C++初始化列表
C++初始化列表 定义一个类对象时,常常使用初始化列表实例化一个对象,在进入构造函数函数体之前对成员变量完成初始化操作.普通成员变量既可以在初始化中初始化,也可以在函数体重赋值:const成员变量只能 ...
- 【c++】必须在类初始化列表中初始化的几种情况
转自:http://www.cnblogs.com/kaituorensheng/p/3477630.html 1. 类成员为const类型 2. 类成员为引用类型 #include <iost ...
- C++语法 初始化列表 数组引用
只能在初始化列表initilizationlist中初始化的有: 1.const修饰的数据成员或者reference参考 2.基类的构造函数 注意,数组不能引用,亦即以下代码是不对的 void fun ...
- C++定义构造函数必须使用初始化列表的场合
明其理,而知其然也. 先给理论.1. 初始化 != 赋值. a.初始化代表为变量分配内存. 变量在其定义处被编译器初始化(编译时). 在函数中, 函数参数初始化发生在函数调用时(运行时). b.赋值代 ...
- C++-什么时候需要在类的构造函数中使用初始化列表
1,如果基类没有default构造函数,则意味着其不能自己初始化.如果其被派生,派生类的构造函数要负责调用基类的构造函数,并传递给它需要的参数.下例中Base 2,如果类成员没有默认构造函数.下例中E ...
- C++:四种必须使用初始化列表情况
[c++]必须在类初始化列表中初始化的几种情况 1. 类成员为const类型 2. 类成员为引用类型 复制代码 #include <iostream> using namesp ...
- C++类构造函数初始化列表
C++类构造函数初始化列表 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class CExample {public: ...
- C++11初始化列表
[C++11之初始化列表] 在C++03中,在严格遵守POD的定义和限制条件的结构及类型上可以使用初始化列表(initializer list),构想是结构或是数组能够依据成员在该结构内定义的顺序通过 ...
随机推荐
- UIWebvView 解决onClick 延迟相应问题
在使用 UIWebView 的过程中, 发现 onClick 触发需要等待300-500ms, Google了一下, 发现是因为ScrollView 在等待doubleTap, 所以有延迟 使用如下代 ...
- HTML5 总结-SVG-5
HTML5 内联 SVG HTML5 支持内联 SVG. 什么是SVG? SVG 指可伸缩矢量图形 (Scalable Vector Graphics) SVG 用于定义用于网络的基于矢量的图形 SV ...
- Regex阅读笔记(一)之入门
在检查一行文本时,^代表一行的开始,$代表结束. 字符数组:[],在里面列举任意多个字符,可以匹配其中任意一个字符,字符组元字符'-'表示一个范围. ^$表示一个空行(没有任何字符,包括空白字符) [ ...
- Sqlite出现SQL error: database disk image is malformed的处理
SQLite有一个很严重的缺点就是不提供Repair命令.导致死亡提示database disk image is malformed它的产生有很多种可能,比如,磁盘空间不足,还有就是写入数据过程中突 ...
- QT中的qmake详解
关于qmake,好一段时间令我一头雾水,不知道用来干嘛的,只知道怎么用,而且也只懂那么一两个命令,详细看过资料以后整理如下: 1.首先,感性的认识是,qmake可以利用源文件(包括头文件h,实现文件c ...
- C/C++用strncpy()与strstr()分割与匹配查找字符串
最近做题遇到分割与匹配字符串的题目(hdu5311),看来别人的代码,才知道有strncpy()和strstr()函数,于是搜集了一点资料,记录一下基本用法. 一.strncpy() char * s ...
- Pick-up sticks(判断两直线相交)
Pick-up sticks Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 11335 Accepted: 4250 D ...
- 使用ORACLE SQL Tuning advisor快速优化低效的SQL语句
ORACLE10G以后版本的SQL Tuning advisor可以从以下四个方面给出优化方案 (1)为统计信息丢失或失效的对象收集统计信息 (2)考虑优化器的任何数据偏差.复杂谓词或失效的统计信 ...
- Visual Studio 创建和使用dll的方法
DLL是一个包含可由多个程序同时使用的代码和数据的库. DLL文件就是把一些函数导出来,然后在新程序中进行复用的过程. 第一部分:使用Visual Studio 2010进行DLL的制作 生成方法一: ...
- QT5.6 编译SQLServer驱动
简要说下编译的主要步骤 @1:打开vs2015的命令行编译环境 ‘ @2:进入到cd到源码目录:cd C:\Qt\Qt5.6.0\5.6\Src\qtbase\src\plugins\sqldrive ...