关于c++,构造函数与析构函数的关系

#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout<<"A"<<endl;
}
~A()
{
cout<<"~A"<<endl;
}
};
class B:public A
{
A *p;
public:
B()
{
cout<<"B"<<endl;
p=new A;
}
~B()
{
cout<<"~B"<<endl;
delete p;
}
};
int main()
{
B obj;
return 0;
}
为什么输出的是A B A ~B ~A ~A,析构函数不是应该与构造函数相反么?那为什么不是~A ~B ~A?

我具体解释一下,因为你这个B是从A派生出来的,因此构造的时候先构造A再构造B,然后你在B的构造函数中new了一个A,于是又构造了一个A。注意:B和第二个A完全是由于你构造函数中的语句顺序决定的,如果你先new再cout,B和A就反过来了。
同理析构的时候先析构B再析构A,在析构B的时候它先cout再delete A,因此顺序是~B~A~A,第一个A对应的是delete 的那个A。
你说的析构函数应该与构造函数相反只适用于不看new出来的那个A的情况,这个A的顺序完全是由你写的语句顺序决定的。踢掉这个A后,顺序就是AB~B~A
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-08-19
cout<<"~B"<<endl;
delete p;
既然觉得相反 这两句的位置为什么不倒一倒?
你可是先cout B再new A的. 要相反自然要先delele A再cout ~B本回答被网友采纳

构造函数和析构函数
构造函数与析构函数的执行顺序遵循一定规则,确保程序运行的稳定性和资源的合理使用。在C++编程中,正确理解并应用这两个函数,能有效提升代码质量,避免资源泄露等问题。构造函数在创建对象时触发,初始化对象状态,为后续操作做准备。通过在构造函数内添加特定代码,如"Construct!",可以验证其执行时机。反之...

c++ 什么叫析构函数? 他的输出与构造函数相反么?
包含构造函数和析构函数的C++程序。#include<string>#include<iostream>using namespace std;class stud \/\/声明一个类{private: \/\/ 私有部分int num;char name[10];char sex ;public: \/\/公用部分stud(int n,char nam[],char s ) \/\/构造函数{num = n;strcpy (name, nam);sex = s;}~stud...

什么是析构函数?
析构函数是特殊的类成员函数,简单来说,析构函数与构造函数的作用正好相反,它用来完成对象被删除前的一些清理工作,也就是专门的扫尾工作。如果构造函数打开了一个文件,最后不需要使用时文件就要被关闭,析构函数允许类自动完成类似清理工作,不必调用其他成员函数。

理解\/总结C++中的构造函数和析构函数
在C++中,构造函数和析构函数扮演着至关重要的角色。它们分别负责对象的初始化和清理工作,这些操作是编译器强制要求的,即使不显式定义,编译器也会提供默认的空实现。构造函数用于在创建对象时为成员属性赋值,无返回值,函数名与类名相同,并支持重载,确保仅在创建对象时调用一次。析构函数则在对象销...

c++构造函数和析构函数的区别
1、概念不同:析构函数:对象所在的函数已调用完毕时,系统自动执行析构函数。构造函数:是一种特殊的方法。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。2、作用不同:析构函数:析构函数被调用。构造函数:为对象成员变量赋初始值 3、...

关于c++派生类构造函数和析构函数的说法
这跟盖房拆房一个道理,盖时肯定要先盖基础(相当于建立时先调用基类),再盖上面(再调用派生类)拆房时,肯定很从上面拆(先调用派生类的析构函数),再拆下面(再调用基类的析构函数)其实上面只有简单的解释,上面的调用是因为,若你先调用基类的析构函数,会把派生类正在用的一次资源销毁,因为此时派生类...

C++构造函数和析构函数到底有什么作用啊?。。。一菜鸟求助!!!_百度...
析构函数的定义方式为 ~类名(){ 函数体 } 如果程序员在定义类时没有为类提供析构函数,则系统会自动创建一个默认的析构函数,其形式为 ~类名(){ } 对象被析构的顺序与其创建时的顺序正好相反,即最后构造的对象最先被析构。如果一个对象是被new运算符动态创建的,当使用delete运算符释放它...

C++构造函数和析构函数详解
C++构造函数和析构函数详解如下:一、构造函数简介 在上一个章节我们在创建好类的对象之后,首先对它的每一个成员属性赋值之后再对它们进行输出操作,如果不赋值就输出,这些值就会是垃圾值。而为了代码的简介,一次性为所有成员属性初始化,C++的类提供了这样的一个函数—构造函数。C++提供构造...

c++中什么时候调用构造函数和析构函数
A a ; 定义一个对象a的时候, 就调用构造函数,默认构造函数都是无参数的 ,构造函数就相当给对象a初始化而已,就相当于c语言中 int a = 3 初始化a的值而已,以为你在类中是不能直接给private中的类成员赋值的,所以就靠构造函数,不过要注意有参构造和无参构造,默认都是无参的,比如你A ...

C++构造和析构函数的特征和继承的概念
1、C++的构造函数,函数名与类名同名。一旦该类分配内存,就自动激活构造函数;析构函数函数名是在类名譬如class1前面加上~,析构函数是撤销该类内存之前,最后一个执行,且是自动激活的函数。他们都没有返回值。2、继承是子类的成员函数可以继承父类的成员--成员变量或成员函数(private属性的不能继承...

相似回答