构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:
Example::Example() : ival(0), dval(0.0)
{
//ival 和dval是类的两个数据成员
}
上面的例子和下面不用初始化列表的构造函数看似没什么区别:
Example::Example()
{
ival = 0;
dval = 0.0;
}
二者的区别在于:上面的构造函数(使用初始化列表的构造函数)显示的初始化类的成员;而没使用初始化列表的构造函数是对类的成员赋值,并没有进行显示的初始化。但有时必须用带有初始化列表的构造函数:
(1)成员类型是没有默认构造函数的类。若没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。
(2)const成员或引用类型的成员。因为const对象或引用类型只能初始化,不能对他们赋值。
(3)在继承里面,只有初始化列表可以构造父类的private成员。
因为类类型的数据成员对象在进入函数体前已经构造完成,也就是说在成员初始化列表处进行构造对象的工作,调用构造函数,在进入函数体之后,进行的是对已经构造好的类对象的赋值,又调用个拷贝赋值操作符才能完成(如果并未提供,则使用编译器提供的默认按成员赋值行为)
初始化列表的成员初始化顺序: C++初始化类成员时,是按照声明的顺序初始化的,而不是按照出现在初始化列表中的顺序。
class CMyClass
{
CMyClass(int x, int y);
int m_x; int m_y;
};
CMyClass::CMyClass(int x, int y) : m_y(y), m_x(m_y) { }
编译器先初始化m_x,然后是m_y,因为它们是按这样的顺序声明的。结果是m_x将有一个不可预测的值。有两种方法避免它,一个是总是按照你希望它们被初始化的顺序声明成员,第二个是,如果你决定使用初始化列表,总是按照它们声明的顺序罗列这些成员。这将有助于消除混淆。
分享到:
相关推荐
关于“C++构造函数初始化列表 ”的实例分析
C++ Primer中在讲构造函数初始化列表的时候有这么一段话:无论是在构造函数初始化列表中初始化成员,还是在构造函数体中对它们赋值,最终结果是相同的。不同之处在于,使用构造函数初始化列表的版本初始化数据成员,...
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如: class CExample { public: int a; float b; //构造函数初始化列表 CExample(): a(0...
Derive 类构造函数两个 Base 类型的参数,分别赋给该类两个 Base 类型的成员变量 b1、b2,一个使用初始化列表,一个使用等于号赋值。输出结果如下: 前两行输出是主函数前两行构造 b1、b2 对像时调用的带...
天轰穿系列教程之-16利用构造函数初始化对象天轰穿系列教程之-16利用构造函数初始化对象天轰穿系列教程之-16利用构造函数初始化对象天轰穿系列教程之-16利用构造函数初始化对象天轰穿系列教程之-16利用构造函数初始...
它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,而没有默认构造函数,这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,如果没有初始化列表,那么他将无法完成第一...
1.只能在构造函数初始化列表初始化的成员变量的类型? a.const成员变量 b.引用类型的成员变量 c.static不能在初始化列表中进行初始化 d.类成员变量中有自定义类型的变量最好在初始化列表中进行初始化 2.初始...
c++初始化列表和构造函数初始化区别.pdf
主要介绍了c++ 子类构造函数初始化及父类构造初始化的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
首先,运行下图中的C++代码,输出是...在C++中,成员变量的初始化顺序与变量在类型中的声明顺序相同,而与它们在构造函数的初始化列表中的顺序无关。因此在这道题中,会首先初始化n1,而初始n1的参数n2还没有初始化,是
主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。
2.缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空 3.创建一个对象时,系统自动调用构造函数 析构函数 1.析构函数没有参数,也没有返回值。不能重载,也...
构造函数的部分初始化,可以更好地了解函数如何初始化
讲解了为什么要初始化列表,初始化列表和在构造函数中赋值的区别
关于C++构造函数初始化的详细介绍,值得学习的东西哦
cpp代码-C++:初始化列表:2.向构造函数传递参数
有时,在一个类中有几个构造函数,以容纳某些可选参数,这些构造函数都包含一些共同的代码。 例如,下面的情况: class Car { private string description; private uint nWheels; public Car(string model,...
C++构造函数按下列顺序被调用: (1)任何虚拟基类的构造函数按照它们被继承的顺序构造; (2)任何非虚拟基类的构造函数按照它们被继承的顺序构造; (3)任何成员对象的构造函数按照它们声明的顺序调用; (4...
(2)类的构造函数通过使用冒号:运算符提供了初始化成员的方法。 2.析构函数 析构函数在对象超出作用范围或使用delete运算符释放对象时被调用,用于释放对象占用的空间。如果用户没有显式地提供析构函数,系统会提供...