Skip to main content
 首页 » 编程设计

C++中的构造析构函数

2022年07月19日79soundcode

一、构造函数

1. 构造函数:这个成员函数名必须和类名相同,定义时可以有参数,但是不可以有任何返回类型的声明。

2. 构造函数调用的三种方式

Test t1(4);   //自动调用构造函数 
Test t2 = 5;  //自动调用构造函数 
Test t3 = Test(6); //主动调用构造函数

3. 当类中已经写了构造函数了,C++将不再为类提供无参的空函数的默认构造函数。

4. 当类中没有定义拷贝构造函数时,编译器会默认提供一个拷贝构造函数,简单的进行成员变量值复制,浅拷贝。拷贝构造函数的参数是同类对象的const引用,语义是用参数对象的内容初始化当前对象。

Test(const Test &v) 
{......}

函数调用时,若类的对象做为参数或返回,会自动调用拷贝构造函数,用来完成对象值的传递。也就意味在在已有数值的基础上生成新的对象。当直接用一个对象去初始化另一个对象时,也会自动调用拷贝构造函数。

对象之间的赋值是通过拷贝构造函数实现的,类似于赋值符号"="重载,能赋值过去多少,取决于拷贝构造函数

若是没有提供拷贝构造函数,C++提供的默认的拷贝构造函数会进行成员变量的全部一一拷贝,但不会做其它事情,比如申请内存。

注意: 使用一个对象去初始化另一个对象使用的是拷贝构造函数,例如 Array a2=a1; 对象间的赋值调用的是"="重载,例如 a2=a1;

5. 成员函数可以重载,构造函数也可以重载。

6. 可以在代码中直接调用构造,产生一个临时对象,又立即析构了。

7. 在类定义中成员变量是不允许被赋初值的,比如成员变量const int c; 若不在类中定义需要赋初值。

类的const成员会被分配空间的,本质是只读变量。因为编译时不知道其值是多少,因此不会进入符号表。const成员变量必须在初始化列表中进行初始化

8. 构造函数的初始化列表,格式为: 类名::类名():m1(v1), m2(v1,v2), m3(v3)  其中”类名::类名()”是构造函数,分号后面是初始化列表,m1 m2 m3是(类)成员变量,v1 v2 v3是初始化值。

注意:成员变量的初始化顺序与声明的顺序相关,与在初始化列表中的顺序无关。初始化列表先于构造函数的函数体执行。

9. 构造函数的调用次序为: 当类中的成员变量是其它类的对象时,首先调用成员变量的构造函数,调用顺序与声明顺序相同,之后再调用类自身的构造函数。

析构函数的调用程序与对应的构造函数调用的次序相反。

10. 构造函数使用默认参数挺好

Test(int a = 0, int b = 0) 
{ 
    this->a = a; 
    this->b = b;       
} 
//调用: 
Test t1; 
Test t1(1); 
Test t1(1, 2);

二、析构函数

1. 析构函数定义为 ~ClassName(),析构函数没有参数,没有任何返回类型的声明。析构函数只有一个,没有参数,因此不可重载。一个对象在销毁时自动调用析构函数。


本文参考链接:https://www.cnblogs.com/hellokitty2/p/14585880.html