C++构造函数知识点整理(C++11标准)

时间:2022-12-20 14:12:15

引言

        构造函数是c++中的一个比较难的语法知识点。编程实践中,由于在很多情况下可以不显示定义构造函数,或者,虽然定义构造函数的方式并不十分适当,但是程序也能正常运行,故而并不是特别引起开发者的重视。

实际上,构造函数对C++语言十分重要,深入理解构造函数既能加深对很多C++高级语法,尤其是编译时,运行时,类的实例化和继承等概念的理解,而且能帮助我们写出更加健壮的代码。

        本文从C++构造函数的概念出发,研究构造函数相关的理论和应用。包括构造函数的分类、形式、编译、运行(调用)等。在叙述的同时,辅以一些程序例子,并在一些易混淆的地方与Java、C#的构造函数进行对比。

  本文中一些知识点来源于一些专业著作和网上资源,文章结尾有对这些资源的引用。

 构造函数的概念的语法形式

        构造函数(constructor),是类的成员函数的一种(关于构造函数属不属于类的成员函数,这里不做深究。很多资料将构造函数称为构造子,尤其在Java和C#中,将构造函数称为constructor,而将类的其它函数称作方法 - method),其作用是在定义类的实例时执行初始化操作(例如类成员变量的初始化、赋值,以及一些其它的操作)。

  我们知道,函数有三要素:函数名、形参列表和返回值。对于类成员函数来说,可能还包含其它修饰符,比如访问修饰符(public,protected,private),静态修饰符(static)等。而对于构造函数来说,跟普通的成员函数相比最大的不同如下:

  1. 构造函数必须与类同名;

  2. 构造函数没有返回值。

  3. 构造函数不能被直接显示调用。构造函数会在实例化(instantiate)类的时候被运行时调用,但不能被程序员显示调用(也可以理解为,当在代码中创建一个类的实例时,就是在调用构造函数)。

  例如:

class DemoClassA{
public:
   DemoClassA(){}
   DemoClassA(int a):m_a(a){
}
private:
   int m_a;   
};

  上面的代码只是一个简单的例子,可以看到,定义了两个构造函数,其中一个时无参的默认构造函数,另外一个时重载(overloaded)的含参构造函数,并用构造函数初始化值列表对类的成员变量进行了初始化。

默认构造函数,合成默认构造函数

  没有形参列表的构造函数称为默认构造函数

  开发者在定义一个类时,可以选择显示定一个构造函数(或者显示定义多个重载的构造函数),也可以不显示定义构造函数。如果开发者没有显示定义任何的构造函数(包括默认构造函数),则编译器会为类生成一个默认的构造函数,称为合成默认构造函数

  如果没有特殊需求,建议开发者显示定义默认构造函数(尤其在已经定义了非默认构造函数时),原因如下:

  1. 很多情况下,创建一个类的实例时,调用程序并不急于(或者不能够)对类的成员变量进行有意义的初始化,而是在运行过程中通过类似Java的SetXXX或者C#的属性的方式对成员变量赋值,因而,保留类的默认构造函数,可以方便类的使用者在初始化时无需考虑成员变量的初始化问题。除非一个类在设计时,就明确要求在其实例化时通过构造函数获得一些参数值,以执行一些特定操作(比如成员变量赋值,逻辑判断等),此时应当定义非默认构造函数,并有意不定义默认构造函数,或者定义一个私有的默认构造函数,来达到禁止利用默认构造函数实例化的目的。

  2. 当类的成员变量中包含基本数据类型或者复合数据类型(例如引用或者指针),这一点上,类成员变量的初始化规则跟函数局部变量的初始化规则相同。

  

 

构造函数的定义和重载

介绍构造函数的重载规则前,先简要梳理一下普通成员函数的重载和调用规则。

构造函数由于要初始化成员变量,故而不能被修饰成const成员函数。

 

构造函数初始值列表、类内初始值

类内初始值是指在定义成员变量时赋给成员的初始值,包括在成员变量声明之处给的初始值,或者在类外定义的初始值。

需要注意,在C++中,初始化和赋值是两个不同的概念。

 

构造函数的编译和运行

C++类的构造函数编译规则(参考对比Java和C#构造函数的编译和运行规则)

编译时,编译器知道一个类实例化时所需要的内存空间大小。

很多编译器能对成员变量进行优化,故而在c语言中定义一个结构体时需要注意的字节对齐问题,C++编译器能够帮助解决。

 

构造函数和析构函数

析构函数可以用virtual修饰,构造函数不能

 

 

参考资料

1. C++ Primer(中文版 第5版),Stanley B. Lippman,Josée Lajoie,Barbara E. Moo 著;王刚,杨巨峰 译;叶劲峰,李云,刘未鹏 等 校

2.  http://blog.csdn.net/grief_of_the_nazgul/article/details/45741849

3.