C++的默认构造函数

来源:互联网 发布:usb虚拟打印机端口创建 编辑:程序博客网 时间:2024/05/14 13:05

最近在看《C++高级编程》,对一些可能容易被忽视的小问题最一些记录吧。

 

默认构造函数没有参数,在大多数情况下您都必须提供一个默认构造函数,如果不提供的话可能会导致编译错误。

 

1、什么时候需要默认构造函数呢?

在创建对象数组的时候。创建对象数组会做两件事:为所有的对象分配连续的内存空间,为每个对象调用默认构造函数,因为C++没有提供任何语法让在创建对象数组的时候直接调用不同的构造函数。例如如果你没有定义为CStudent的默认构造函数,下面的语句将无法编译:

CStudent student[5];//或者CStudent *students = new CStudent[5];


同样,如果想在STL容器中存储类,也必须定义默认构造函数。

 

2、在栈中和在堆中创建对象的时候使用不同的语法调用默认构造函数

例如您定义了一个类

 

class CStudent{public:    CStudent();    CStudent(int ID);    void setID(int ID);    private:    int mID;}


您在创建对象的时候可能调用了构造函数给其指定ID,调用的语法如下:

CStudent student(3);//在栈中创建//或者CStudent *student = new CStudent(3);//在堆中创建

从上面看,它们都使用了函数调用的语法,但是,如果你是用默认构造函数的时候,也使用函数调用的语法,就像下面这样:

CStudent student();//这样调用是错误的,但是这句话可以被编译通过。student.setID(3);//这句话将会产生编译错误。

编译以上两行的时候,试图调用默认构造函数的那行可以被编译通过,但是后面的行没法编译。原因是编译器实际上将第一行当做函数声明,函数名为student,返回值为CStudent的类的对象。这样编译第二行的时候编译器以为你是将函数名当做对象使用!

因此,正确的语法是这样:

CStudent student;//栈中创建对象调用默认构造函数的时候不需要加()使用函数调用的语法。student.setID(3);

然而,在堆中创建对象调用默认构造函数的时候,则需要使用函数调用的语法:

CStudent *student = new CStudent();//在堆中创建对象调用默认构造函数时,后面要加()

 

以上代码片段是参考书中的情况写的。
为什么会这样呢,书中也没有说明,只是叫我们不要浪费时间去研究为什么,好吧,我们就听作者的吧。

 

3、编译器自动生成默认构造函数

上面的类如果这样声明:


 

class CStudent{public:    void setID(int ID);    private:    int mID;}


下面的代码可以正常运行:

CStudent student;student.setID(3);


但是如果类的声明改为:

 

class CStudent{public:    CStudent(int ID);    void setID(int ID);private:    int ID;}


上面的语句将无法被编译,原因是如果你没有指定任何构造函数,编译器将会自动生成一个默认构造函数,如果你声明了默认构造函数或者其他构造函数,编译器就不会自动生成默认构造函数了。



 

0 0