C++主题——成员初始化列表
2010-11-22 16:21
501 查看
C++为类中提供类成员的初始化列表
类对象的构造顺序是这样的:
1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员
2.进入构造函数后在构造函数中执行一般计算
使用初始化列表有两个原因:
1.必须这样做:
如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,而没有默认构造函数,这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,如果没有初始化列表,那么他将无法完成第一步,就会报错。
class ABC
{
public:
ABC(int x,int y,int z);
private:
int a;
int b;
int c;
};
class MyClass
{
public:
MyClass():abc(1,2,3){}
private:
ABC abc;
};
因为ABC有了显示的带参数的构造函数,那么他是无法依靠编译器生成无参构造函数的,所以没有三个int型数据,就无法创建ABC的对象。
ABC类对象是MyClass的成员,想要初始化这个对象abc,那就只能用成员初始化列表,没有其他办法将参数传递给ABC类构造函数。
另一种情况是这样的:当类成员中含有一个const对象时,或者是一个引用时,他们也必须要通过成员初始化列表进行初始化,因为这两种对象要在声明后马上初始化,而在构造函数中,做的是对他们的赋值,这样是不被允许的。
2.效率要求这样做:
类对象的构造顺序显示,进入构造函数体后,进行的是计算,是对他们的赋值操作,显然,赋值和初始化是不同的,这样就体现出了效率差异,如果不用成员初始化类表,那么类对自己的类成员分别进行的是一次隐式的默认构造函数的调用,和一次复制操作符的调用,如果是类对象,这样做效率就得不到保障。
注意:构造函数需要初始化的数据成员,不论是否显示的出现在构造函数的成员初始化列表中,都会在该处完成初始化,并且初始化的顺序和其在声明时的顺序是一致的,与列表的先后顺序无关,所以要特别注意,保证两者顺序一致才能真正保证其效率。
选自:http://blog.csdn.net/Xscarlet/archive/2007/04/07/1555584.aspx
另一篇:http://blog.chinaunix.net/u2/75321/showart_1161692.html
另一篇文章:
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:
Example::Example() : ival(0), dval(0.0) {}//ival 和dval是类的两个数据成员
上面的例子和下面不用初始化列表的构造函数看似没什么区别:
Example::Example()
{
ival = 0;
dval = 0.0;
}
的确,这两个构造函数的结果是一样的。但区别在于:上面的构造函数(使用初始化列表的构造函数)显示的初始化类的成员;而没使用初始化列表的构造函数是对类的成员赋值,并没有进行显示的初始化。
初始化和赋值对内置类型的成员没有什么大的区别,像上面的任一个构造函数都可以。但有的时候必须用带有初始化列表的构造函数:
(1) 成员类型是没有默认构造函数的类。若没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。
(2) const成员或引用类型的成员。因为const对象或引用类型只能初始化,不能对他们赋值。
选自:http://www.cppblog.com/baggio1984/archive/2007/09/30/33270.html
类对象的构造顺序是这样的:
1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员
2.进入构造函数后在构造函数中执行一般计算
使用初始化列表有两个原因:
1.必须这样做:
如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,而没有默认构造函数,这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,如果没有初始化列表,那么他将无法完成第一步,就会报错。
class ABC
{
public:
ABC(int x,int y,int z);
private:
int a;
int b;
int c;
};
class MyClass
{
public:
MyClass():abc(1,2,3){}
private:
ABC abc;
};
因为ABC有了显示的带参数的构造函数,那么他是无法依靠编译器生成无参构造函数的,所以没有三个int型数据,就无法创建ABC的对象。
ABC类对象是MyClass的成员,想要初始化这个对象abc,那就只能用成员初始化列表,没有其他办法将参数传递给ABC类构造函数。
另一种情况是这样的:当类成员中含有一个const对象时,或者是一个引用时,他们也必须要通过成员初始化列表进行初始化,因为这两种对象要在声明后马上初始化,而在构造函数中,做的是对他们的赋值,这样是不被允许的。
2.效率要求这样做:
类对象的构造顺序显示,进入构造函数体后,进行的是计算,是对他们的赋值操作,显然,赋值和初始化是不同的,这样就体现出了效率差异,如果不用成员初始化类表,那么类对自己的类成员分别进行的是一次隐式的默认构造函数的调用,和一次复制操作符的调用,如果是类对象,这样做效率就得不到保障。
注意:构造函数需要初始化的数据成员,不论是否显示的出现在构造函数的成员初始化列表中,都会在该处完成初始化,并且初始化的顺序和其在声明时的顺序是一致的,与列表的先后顺序无关,所以要特别注意,保证两者顺序一致才能真正保证其效率。
选自:http://blog.csdn.net/Xscarlet/archive/2007/04/07/1555584.aspx
另一篇:http://blog.chinaunix.net/u2/75321/showart_1161692.html
另一篇文章:
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:
Example::Example() : ival(0), dval(0.0) {}//ival 和dval是类的两个数据成员
上面的例子和下面不用初始化列表的构造函数看似没什么区别:
Example::Example()
{
ival = 0;
dval = 0.0;
}
的确,这两个构造函数的结果是一样的。但区别在于:上面的构造函数(使用初始化列表的构造函数)显示的初始化类的成员;而没使用初始化列表的构造函数是对类的成员赋值,并没有进行显示的初始化。
初始化和赋值对内置类型的成员没有什么大的区别,像上面的任一个构造函数都可以。但有的时候必须用带有初始化列表的构造函数:
(1) 成员类型是没有默认构造函数的类。若没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。
(2) const成员或引用类型的成员。因为const对象或引用类型只能初始化,不能对他们赋值。
选自:http://www.cppblog.com/baggio1984/archive/2007/09/30/33270.html
相关文章推荐
- C++主题——成员初始化列表
- C++主题——成员初始化列表
- <转载自刘佳ID:freedom0203和waret> C++中成员初始化列表的使用
- C++为类中提供类成员的初始化列表
- C++ 成员初始化列表
- C++初始化成员列表(member initialization list)
- c++ 捕获构造函数成员初始化列表产生的异常
- C++初始化列表问题,类中有一个对象类型的数组成员变量,在初始化列表中初始化时报错“[]”操作符语法错误
- C++成员初始化列表使用总结
- C++成员初始化列表
- C++为类中提供类成员的初始化列表(★firecat推荐★)
- C++中使用初始化列表比在构造函数中对成员变量赋值更高效
- C++成员变量初始化列表和变量初始化顺序
- C++对象模型——成员初始化列表(第二章)
- 【C++】类的特殊成员变量+初始化列表
- C++成员初始化列表
- c++ 用参数初始化列表对数据成员初始化
- C++学习记录14--C++成员初始化列表
- [原创]C++中成员初始化列表的使用!!!
- C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别