浅析C++中的C++构造函数

在下面文章主要介绍C++构造函数的相关问题,使用一个简单的构造函数定义了名为 Taxi 的类,然后使用 new 运算符来实例化该类,在为新对象分配内存之后,new 运算符立即调用 Taxi 构造函数。

C++构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:

class CExample {  


 


public:  


 


    int a;  


 


    float b;  


 


    //构造函数初始化列表  


 


    CExample(): a(0),b(8.8)  


 


    {}  


 


    //构造函数内部赋值  


 


    CExample()  


 


    {  


 



        a=0;  



 



        b=8.8;  



 


    }  


 


}; 

上面的例子中两个构造函数的结果是一样的。上面的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)  


 


{  


 


} 

成员类型是没有默认C++构造函数的类。若没有提供显示初始化式,则编译器隐式使用成员类型的默认C++构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。

结果上相同,但是性能上存在很大的差别。因为类类型的数据成员对象在进入函数体前已经构造完成,也就是说在成员初始化列表处进行构造对象的工作。调用构造函数,在进入函数体之后,进行的是对已经构造好的类对象的赋值,又调用个拷贝赋值操作符才能完成(如果并未提供,则使用编译器提供的默认按成员赋值行为。

相关推荐