C++构造函数、析构函数、虚析构函数

简介: 1.构造函数   C++中的构造函数是用于初始化类的各种变量以及分配资源等。主要的注意事项是:   (1)在继承关系中先初始化父类对象后初始化子类对象。   (2)在一个类中按照变量的声明顺序,对类中的变量进行初始化。

1.构造函数

  C++中的构造函数是用于初始化类的各种变量以及分配资源等。主要的注意事项是:

  (1)在继承关系中先初始化父类对象后初始化子类对象。

  (2)在一个类中按照变量的声明顺序,对类中的变量进行初始化

  (3)初始化过程中,可以使用已经被初始化的对象去初始化其他的对象。

2.析构函数

  析构函数与构造函数作用相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。

  析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。

  调用顺序与构造函数正好相反,先析构子类(释放子类资源),在析构父类(释放父类资源)。

3.虚析构函数

  虚析构函数可以认为是特殊的析构函数,主要作用在继承关系中。

  若B是A的子类:  A *a=new B;

          delete a;

  如果A的析构函数是non-vartual,则只会调用A的析构函数,这样B的资源没有释放,就会有内存泄露;

  如果A的析构函数是vartual,则只会先调用A的析构函数,再调用B的析构函数。

  (见C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别

4.代码示例

 1 #include <iostream>
 2 using namespace std;
 3 class A{
 4 public:
 5     A(int _a):a(_a){
 6         cout<<"A constructed function"<<endl;
 7     }
 8 
 9     virtual ~A(){
10         cout<<"A destructor function"<<endl;
11     }
12 
13     int getA(){
14         return a;
15     }
16 private:
17     int a;
18 };
19 
20 class B:public A{
21 public:
22     B(int _a,int _b):b(_b),A(_a){
23         cout<<"B constructed function"<<endl;
24     }
25 
26     ~B(){
27         cout<<"B destructor function"<<endl;
28     }
29 
30     int getAplusB(){
31         return b+getA();
32     }
33 private:
34     int b;
35 };
36 
37 int main(void)
38 {
39     B b(2,3);
40     cout<<b.getAplusB()<<endl;
41     cout<<"***********************************"<<endl;
42     A *a=new B(2,3);
43     cout<<"***********************************"<<endl;
44     delete a;
45     return 0;
46 }

 执行输出:

 

相关文章
|
2月前
|
编译器 C++
C++ 类构造函数初始化列表
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。
72 30
|
1月前
|
编译器 C语言 C++
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
18 1
|
1月前
|
C++
C++构造函数初始化类对象
C++构造函数初始化类对象
15 0
|
1月前
|
C++
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
20 0
|
3月前
|
编译器 C++
C++的基类和派生类构造函数
基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承。构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,不能成为派生类的构造函数,当然更不能成为普通的成员函数。 在设计派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数完成,但是大部分基类都有 private 属性的成员变量,它们在派生类中无法访问,更不能使用派生类的构造函数来初始化。 这种矛盾在C++继承中是普遍存在的,解决这个问题的思路是:在派生类的构造函数中调用基类的构造函数。 下面的例子展示了如何在派生类的构造函数中调用基类的构造函数:
|
4月前
|
编译器 C++
【C++】详解构造函数
【C++】详解构造函数
|
5月前
|
存储 编译器 C++
【C++】类和对象④(再谈构造函数:初始化列表,隐式类型转换,缺省值
C++中的隐式类型转换在变量赋值和函数调用中常见,如`double`转`int`。取引用时,须用`const`以防修改临时变量,如`const int& b = a;`。类可以有隐式单参构造,使`A aa2 = 1;`合法,但`explicit`关键字可阻止这种转换。C++11起,成员变量可设默认值,如`int _b1 = 1;`。博客探讨构造函数、初始化列表及编译器优化,关注更多C++特性。
|
5月前
|
存储 编译器 C语言
【C++】类和对象②(类的默认成员函数:构造函数 | 析构函数)
C++类的六大默认成员函数包括构造函数、析构函数、拷贝构造、赋值运算符、取地址重载及const取址。构造函数用于对象初始化,无返回值,名称与类名相同,可重载。若未定义,编译器提供默认无参构造。析构函数负责对象销毁,名字前加`~`,无参数无返回,自动调用以释放资源。一个类只有一个析构函数。两者确保对象生命周期中正确初始化和清理。
|
5月前
|
编译器 C语言 C++
【C++】:构造函数和析构函数
【C++】:构造函数和析构函数
47 0
|
22天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
21 4