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

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 }

 执行输出:

 

时间: 2024-09-23 23:56:52

C++构造函数、析构函数、虚析构函数的相关文章

new-关于虚析构函数的问题

问题描述 关于虚析构函数的问题 #include using namespace std; class A { public: A(){cout << "A" << endl;} virtual ~A(){cout << "~A" << endl;} }; class B : public A { public: B(){cout << "B" << endl;} ~B(){

C++虚析构函数的使用分析_C 语言

在C++中,不能声明虚构造函数,但可以声明虚析构函数.多态性是指不同的对象对同一消息有不同的行为特性.虚函数作为运行时多态性的基础,主要是针对对象的,而构造函数是在对象产生之前运行的,因此虚构造函数是没有意义的.析构函数的功能是在该类对象消亡之前进行一些必要的清理工作,析构函数最好都是virtual的.首先解释一下虚构函数和指针之间是如何交互的,以及虚析构函数的具体含义.例如以下代码,其中SomeClass是含有非virtual析构函数的一个类:SomeClass *p= new SomeCla

静态联编,动态联编,类指针之间的关系,虚函数与多态性,纯虚函数,虚析构函数

1.静态联编,是程序的匹配,连接在编译阶段实现,也称为早期匹配.重载函数使用静态联编. 2.动态联编是指程序联编推迟到运行时进行,所以又称为晚期联编.switch语句和if语句是动态联编的例子. #include<iostream> void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void

【C/C++学院】0823-静态联合编译与动态联合编译/父类指针子类指针释放/虚函数/纯虚函数概念以及虚析构函数/抽象类与纯虚函数以及应用/虚函数原理/虚函数分层以及异质链表/类模板的概念以及应用

静态联合编译与动态联合编译 #include <iostream> #include <stdlib.h> //散列 void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void main() { ///auto p = go;编译的阶段,静态联编 void(*p1)(char *s

不用虚析构函数也不会造成内存泄漏的原因是什么?

问题描述 不用虚析构函数也不会造成内存泄漏的原因是什么? 代码如下: #include using namespace std; class Base { public : Base(){} virtual void fun(){ cout << "from Base :" << endl; } ~Base(){ cout << "from Base destructor:" << endl; fun(); } int

简要解读C++的动态和静态关联以及虚析构函数_C 语言

C++静态关联与动态关联.C++是怎样实现多态性的 在现实生活中,多态性的例子是很多的.我们分析一下人是怎样处理多 态性的.例如,新生被录取人大学,在人学报到时,先有一名工作人员审查材料,他的职责是甄别资格,然后根据录取通知书上注明的录取的系和专业,将材料转到有关的系和专业,办理具体的注册人学手续,也可以看作调用不同部门的处理程序办理入学手续.在学 生眼里,这名工作人员是总的人口,所有新生办入学手续都要经过他.学生拿的是统一的录取通知书,但实际上分属不同的系,要进行不同的注册手续,这就是多态.那

c++-纯虚析构函数的内联实现

问题描述 纯虚析构函数的内联实现 C++ 纯虚析构函数在VS里面可以内联实现,如: class CBase { public: CBase(); virtual ~CBase() = 0 {}; } 这样写在VS里没有问题,但在Eclipse里面这样写C++编译通不过 解决方案 这是C++ 11的写法吧,你用的编译器不一定支持. 解决方案二: 估计是编译器的版本问题,你查查那两个IDE编译器的具体版本的信息. 解决方案三: 编译器不支持,那你就只能分开写了,写成非inline方式 解决方案四:

请教大家一个在虚析构函数存在时,C++虚函数表的问题

问题描述 请教大家一个在虚析构函数存在时,C++虚函数表的问题 下面是在下的代码: #include <iostream> using namespace std; class Point { private: int X; int Y; public: Point() {} Point(int x, int y) : X(x), Y(y) {} const int getX() { return X; } const int getY() { return Y; } virtual ~Poi

C++语言基础 例程 虚析构函数

贺老师的教学链接  本课讲解 问题的由来 #include <iostream> using namespace std; class Point { public: Point( ) { } ~Point() { cout<<"executing Point destructor"<<endl; } }; class Circle:public Point { public: Circle( ) { } ~Circle( ) { cout<&