社区
C++ 语言
帖子详情
为什么析构函数必须无参数,为什么析构的顺序和构造的顺序相反???
fxbb
2006-10-03 09:19:55
我想请高手从较为底层的方面跟我解释一下我上面提出的问题,谢谢
...全文
1105
22
打赏
收藏
为什么析构函数必须无参数,为什么析构的顺序和构造的顺序相反???
我想请高手从较为底层的方面跟我解释一下我上面提出的问题,谢谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
22 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
dead_of_winter
2006-10-06
打赏
举报
回复
为什么不能带参数:
析构函数很多时候是不需要显式执行的 由系统调用销毁对象
系统没法提供你要的参数
qingcairousi
2006-10-06
打赏
举报
回复
如果按栈来解释,那么动态分配的对象怎么解释?静态对象又如何解释?const呢?
---------------------------------------
动态,static,const 都可以看成是修饰,并不影响对象本身,对象内部的构建方式还是以栈为基础的。不是说只有分配到栈上面的才是栈,堆上面的就不是栈了,关键是看管理方式……
justrun2005
2006-10-06
打赏
举报
回复
而虚基类则要求建立虚基表,这也要求先判断如何构造基类
-------------------------------
这句我说的有些出入,应该说,虚拟继承求在派生类完全建立前知道虚基表在何处(以一个虚基表指针成员指向虚基表),而构建虚基表必须先知道基类子对象在何处构建,因此从这方面讲,也有先调用基类构造函数构建基类子对象的要求。
justrun2005
2006-10-06
打赏
举报
回复
如果按栈来解释,那么动态分配的对象怎么解释?静态对象又如何解释?const呢?
justrun2005
2006-10-06
打赏
举报
回复
为什么非要和构造函数的构造顺序相反呢?构造的时候,没有对象,所以基类构造函数不需要知道这个对象是给谁构造的,而派生类要在基类子对象后面分配内存(而虚基类则要求建立虚基表,这也要求先判断如何构造基类),这使得构造必须先从基类开始。
而析构呢?因为你要析构的是派生类的某个对象,所以,你到底要析构那个对象必须先搞清楚,只有派生类析构函数才知道具体析构那个对象,而基类析构则根据派生类析构函数去析构基类子对象。
braveconf() ( ) 说的就很对,构造和析构就是由自身原因决定而非栈。
至于为什么析构没有参数,那是因为一方面析构自动调用,另一方面析构的操作过程都是固定的,没有可变因素,所以没有任何理由给他一个参数。
justrun2005
2006-10-06
打赏
举报
回复
虚拟继承的虚基类在派生链中只产生一个基类子对象实体,所以,派生连中的其他派生自它的类都共享它,那么就要求有一个访问虚基类的间接性,虚基表类似于虚函数表。
杨宇新2023
2006-10-06
打赏
举报
回复
所有动态分配的对象都需要显式调用析构函数,否则会造成内存泄漏!
比如:
CShape* p = new CShape();
必须与
delete p
成对出现.
杨宇新2023
2006-10-06
打赏
举报
回复
什么是"虚基表"?请解释,谢谢!!
dbjk
2006-10-06
打赏
举报
回复
你看一下这个类:
class swust
{
private:
int i,j,k;
public:
swust():i(j),j(5),k(6)
{ }
};
是错误的;
而
class swust
{
private:
int i,j,k;
public:
swust():i(5),j(i),k(6)
{ }
};
是对你就知道为什么了。
lw1a2
2006-10-05
打赏
举报
回复
类对象调用析构函数的时候,对象的生命周期已经结束了,你传个参数进去能怎么样呢?
lin_style
2006-10-05
打赏
举报
回复
为什么析构函数必须无参数,为什么析构的顺序和构造的顺序相反???
第二个问题很好解释啊。
在构造的时候将对象 一一压栈啊,
像WZQ说的 就像你穿衣服和脱衣服一样,肯定是先穿里面的,但是脱的时候先外面了。
这也是C++设计上一个模式啊。
至于析构为什么无参加数。。
换句话说,如果你来写这个模式的话,程序使用了N多的局部变量和全局,静态==,那你
去释放他的时候还需要特定的指定吗? 当然是一开始申明的时候就做好标记了,释放的时候把这些标记释放掉就可以。,再拿个否则说,如果你一开始不指定好这些标记,那你在使用这些变量的时候不是又要去重新指定它们?这符合吗。。。
这根本就不需要底层的解释,,,
wzq84
2006-10-04
打赏
举报
回复
就像你穿衣服和脱衣服一样,肯定是先穿里面的,但是脱的时候先外面了,呵呵!
我啃
2006-10-04
打赏
举报
回复
就像你穿衣服和脱衣服一样,肯定是先穿里面的,但是脱的时候先外面了,呵呵!
------------
很形象,很幽默
析构函数不需要参数
只是将类使用的东西释放还给SYSTEM何必要参数呢??
vigorous001
2006-10-04
打赏
举报
回复
反问一句吧,为什么析构函数要带参数啊?有什么作用么?
如果析构的顺序和构造的顺序相同,把基类的东西先析构,剩下的还是类了吗?
braveconf
2006-10-04
打赏
举报
回复
析构由系统自动调用,如果带参数的话,系统怎么知道要用什么参数呢?
与构造顺序相反是栈操作的缘故。
析构函数并不一定由系统调用,比如 new(mem) A,产生的对象,可以手动调析构函数的。
因为要与构造函数顺序相反,所以采用栈实现。因果关系不要搞错了。
lw1a2
2006-10-04
打赏
举报
回复
就像你穿衣服和脱衣服一样,肯定是先穿里面的,但是脱的时候先外面了,呵呵!
--------------
这个解释很好
fxbb
2006-10-04
打赏
举报
回复
----------------------------------------------------------------------------
qingcairousi(青耕) ( ) 信誉:100 Blog 2006-10-3 21:24:48 得分: 0
析构由系统自动调用,如果带参数的话,系统怎么知道要用什么参数呢?
与构造顺序相反是栈操作的缘故。
---------------------------------------------------------------------------
你好,请问这个栈是不是main()的栈?
你的解释让我大体上有点明白了,谢谢
wangwen116
2006-10-03
打赏
举报
回复
学习拉
杨宇新2023
2006-10-03
打赏
举报
回复
我来给你个例子你一定能明白为什么.
struct SPoint
{
double x;
double y;
};
class CShape
{
private:
SPoint A;
public:
CShape(double x,double y)
{
A.x = x;
A.y = y;
return;
}
~CShape()
{
return;
}
}
class CCircle:public CShape
{
private:
SPoint A;
double round;
public:
CCircle()
{
return;
}
~CCircle()
{
return;
}
}
int main()
{
CCircle circle;
}
CShape是基类,而CCircle是派生类.当你在main中声明CCircle类型的对象时,编译器大概会做这样的事:
1.为circle分配存储空间,可以把这里的存储空间看成两个部分,一是基类的部分,二是派生类在基类的基础上增加的部分.
2.首先调用基类构造器.
3.按派生类的初始化列表指定的顺序对成员初始化.
4.调用派生类构造器.
实际上这是一个递归的过程,基类用同样的方式对待基类的基类.
此处之所以先调用基类构造器,主要原因是基类是派生类的基础,在派生类的任何函数执行时,都会假定基类已经完整.比如派生类的构造器中可能间接引用基类中的变量(一般不可以直接引用,因为变量都是private),此时如果基类还未初始化,后果是无法遇料的.
在析构的过程中,因为同样的原因,也必须先调用派生类的析构器.因为派生类可能间接引用了基类的变量,如果基类首先析构,派生类在遇到间接引用自派生类的变量时就可能不知所措.这就好比拆房子,你先拆下面肯定要出问题.
析构器是不需要参数,带参数也多余,因为析构的目的就是要销毁信息,而你通过参数传入信息,最终也会变成垃圾.
我啃
2006-10-03
打赏
举报
回复
其实和系统函数调用层层反推类似
A :start
b :start
…………
b : end
A :end
是嵌套实现得,如果析构函数也是顺序得那么就大不对了
加载更多回复(2)
C++中对象的
构造
顺序
和
析构
顺序
文章目录1 C++中对象的
构造
顺序
1.1 局部对象的
构造
顺序
1.2 堆对象的
构造
顺序
1.3 全局对象的
构造
顺序
1 C++中对象的
构造
顺序
C++中的类可以定义多个对象,那么对象
构造
的
顺序
是怎样的? 1.1 局部对象的
构造
顺序
对于局部对象: 当程序执行流到达对象的定义语句时进行
构造
。 #include <stdio.h> class Test { private: in...
对C++
构造
函数与
析构
函数
以及成员的
构造
和
析构
顺序
理解
1.对象
构造
过程中执行的
顺序
(1)先
构造
基类的成员 (2)执行基类的
构造
函数(在执行
构造
函数里我们写的代码之前基类的成员已经创建好了) (3)
构造
派生类的成员 (4)执行派生类的
构造
函数 由输出结果可知,先构建基类b的成员也就是c,再执行基类b的
构造
函数。然后再
构造
派生类a的成员d,然后再执行a的
构造
函数。 2.对象
析构
过程中的执行
顺序
(1)先执行派生类的
析构
...
C++中成员变量 父类 子类
构造
析构
顺序
c++中对象都是先
构造
成员变量,再调用自身的
构造
函数;故父类成员变量首先被
构造
,然后调用父类的
构造
函数,再
构造
子类的成员变量,最后调用子类的
构造
函数。 对象
析构
时与
构造
顺序
相反
,子类先调用自身的
析构
函数
,再调用子类成员变量的
析构
函数
,再调用父类的
析构
函数
,再
析构
父类的成员变量。 测试代码如下: #include using namespace std; class Test
[c++] c++ 中的
顺序
(
构造
,
析构
,初始化列表,继承)
对象
构造
的时候,对象成员变量的初始化
顺序
是什么样的?派生类
构造
的时候,先
构造
基类还是先
构造
派生类?
构造
函数中的初始化列表,初始化的
顺序
是列表的
顺序
吗?
析构
的时候,
析构
的
顺序
是什么样的?本文通过实例代码记录上述场景下的
顺序
。先说结论:(1)全局对象以及静态全局对象,在 main 函数调用之前创建(2)
构造
时,先
构造
类中的成员变量,再调用
构造
函数(3)类中成员变量的
构造
顺序
是变量在类中声明的
顺序
(4)初始化列表中,成员变量的初始化
顺序
也是变量在类中声明的
顺序
。
C++
构造
析构
顺序
析构
函数
与
构造
函数的
顺序
继承 先看看下面的代码 #include using namespace std; class A { public: A(){cout "Construct A" endl;} ~A(){cout "Destruct A" endl;} }; class C { public: C(){cout "Construct C" endl;
C++ 语言
65,211
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章