C++类构造函数初始化列表
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:
class CExample { public: int a; float b; //构造函数初始化列表 CExample(): a(0),b(8.8) {} //构造函数内部赋值 CExample() { a=0; b=8.8; } };
上面的例子中两个构造函数的结果是一样的。上面的构造函数(使用初始化列表的构造函数)显式的初始化类的成员;而没使用初始化列表的构造函数是对类的成员赋值,并没有进行显式的初始化。
初始化和赋值对内置类型的成员没有什么大的区别,像上面的任一个构造函数都可以。对非内置类型成员变量,为了避免两次构造,推荐使用类构造函数初始化列表。但有的时候必须用带有初始化列表的构造函数:
1.成员类型是没有默认构造函数的类。若没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。
2.const成员或引用类型的成员。因为const对象或引用类型只能初始化,不能对他们赋值。
初始化数据成员与对数据成员赋值的含义是什么?有什么区别?
首先把数据成员按类型分类并分情况说明:
1.内置数据类型,复合类型(指针,引用)
在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的
2.用户定义类型(类类型)
结果上相同,但是性能上存在很大的差别。因为类类型的数据成员对象在进入函数体前已经 构造完成,也就是说在成员初始化列表处进行构造对象的工作,调用构造函数,在进入函数体之后,进行的是对已经构造好的类对象的赋值,又调用个拷贝赋值操作 符才能完成(如果并未提供,则使用编译器提供的默认按成员赋值行为)
Note:
初始化列表的成员初始化顺序:
C++初始化类成员时,是按照声明的顺序初始化的,而不是按照出现在初始化列表中的顺序。
Example:
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_y=I,然后做 m_x=m_y,最后它们有相同的值。但是编译器先初始化m_x,然后是m_y,,因为它们是按这样的顺序声明的。结果是m_x将有一个不可预测的值。有 两种方法避免它,一个是总是按照你希望它们被初始化的顺序声明成员,第二个是,如果你决定使用初始化列表,总是按照它们声明的顺序罗列这些成员。这将有助 于消除混淆。
相关推荐
构造函数初始化列表是C++中一个非常重要的特性,它允许程序员在对象创建时直接对类中的成员进行初始化,而不是先分配内存再赋值,这在效率和安全性上都有显著优势。 #### 构造函数初始化列表的作用与语法 构造函数...
C++ 中的构造函数初始化是指在类对象创建时对其进行初始化的过程。构造函数是类的特殊成员函数,用于初始化类对象。在 C++ 中,子类构造函数的初始化涉及到父类构造函数的调用,否则将无法正确地初始化从父类继承来...
Derive 类构造函数两个 Base 类型的参数,分别赋给该类两个 Base 类型的成员变量 b1、b2,一个使用初始化列表,一个使用等于号赋值。输出结果如下: 前两行输出是主函数前两行构造 b1、b2 对像时调用的带...
本文将深入探讨C++构造函数中的初始化,包括传统的赋值方式、括号赋值、冒号初始化(也称为成员初始化列表)以及函数体初始化。 首先,C++中存在两种初始化方式:赋值运算符赋值和括号赋值。例如: ```cpp int a =...
1.只能在构造函数初始化列表初始化的成员变量的类型? a.const成员变量 b.引用类型的成员变量 c.static不能在初始化列表中进行初始化 d.类成员变量中有自定义类型的变量最好在初始化列表中进行初始化 2.初始...
构造函数是一种特殊的类成员函数,是当创建一个类的对象时,它被调用来对类的数据成员进行初始化和分配内存。(构造函数的命名必须和类名完全相同) 首先说一下一个C++的空类,编译器会加入哪些默认的成员函数 默认...
在上面的例子中,`Inner inner(5)`就是在外类`Outer`的构造函数初始化列表中调用了`Inner`的构造函数。 构造函数的初始化表达式还可以与C++的聚合初始化、列表初始化和默认构造函数相结合。聚合初始化允许你使用大...
3. 调用基类构造函数:当派生类构造函数需要调用基类的构造函数时,必须在初始化列表中指定基类的构造函数和参数。 4. 初始化成员类(member classes)的构造函数:如果成员变量是另一个类的实例,那么在初始化列表...
它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,而没有默认构造函数,这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,如果没有初始化列表,那么他将无法完成第一...
本文将详细解析一个简单的C++类`cPerson`的实现,重点关注其构造函数、析构函数以及拷贝构造函数。 ### 构造函数 构造函数是在创建类的对象时自动调用的一种特殊成员函数,主要用于初始化对象的数据成员。`cPerson...
2.缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空 3.创建一个对象时,系统自动调用构造函数 析构函数 1.析构函数没有参数,也没有返回值。不能重载,也...
C++语言中的构造函数初始化列表的使用可以分为两方面: 一方面,使用初始化成员列表可以避免类成员的隐式默认构造函数的调用,避免了多余的构造和赋值操作,从而提高效率。例如,在下面的例子中,MyClass中的abc...
对于`const`成员变量,一旦在构造函数初始化列表中初始化,就不能在构造函数的主体中更改其值。同样,引用类型成员必须在初始化列表中立即绑定到一个对象,不能在构造函数的主体中延迟绑定。这是因为引用不是独立的...
如果需要初始化,应该显式地编写无参数构造函数或在类定义中使用成员初始化列表。在涉及容器和动态内存分配时,必须清楚默认构造函数的作用和限制,以避免因未初始化的数据成员而导致的潜在问题。
2. **成员初始化列表**:通过在构造函数声明时提供一个初始化列表来指定成员变量的初始化顺序和方式。 #### 使用场景 成员初始化列表在以下几种情况下尤为重要: ##### 1. 初始化对象成员 当类中包含其他类的...
C++构造函数按下列顺序被调用: (1)任何虚拟基类的构造函数按照它们被继承的顺序构造; (2)任何非虚拟基类的构造函数按照它们被继承的顺序构造; (3)任何成员对象的构造函数按照它们声明的顺序调用; (4...