社区
C++ 语言
帖子详情
为什么析构函数必须无参数,为什么析构的顺序和构造的顺序相反???
fxbb
2006-10-03 09:19:55
我想请高手从较为底层的方面跟我解释一下我上面提出的问题,谢谢
...全文
1020
22
打赏
收藏
为什么析构函数必须无参数,为什么析构的顺序和构造的顺序相反???
我想请高手从较为底层的方面跟我解释一下我上面提出的问题,谢谢
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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)
腾讯2012笔试题目
- B: 先输出基类
构造
函数,再输出子类
构造
函数,然后是子类
析构
函数
和基类
析构
函数
,这是正确的
顺序
。 - C: 只输出了基类的
构造
函数和
析构
函数
,没有考虑子类。 - D: 输出
顺序
错误,基类
构造
函数应该先于子类
构造
...
C++
构造
函数和
析构
函数
的调用
顺序
派生类本身的
析构
函数
、对象成员
析构
函数
、基类
析构
函数
(与
构造
顺序
正好
相反
) 3、特例 局部对象,在退出程序块时
析构
静态对象,在定义所在文件结束时
析构
全局对象,在程序结束时
析构
继承对象,先...
构造
函数、
析构
函数
的执行
顺序
1)
构造
函数
顺序
① 基类
构造
函数。...2)
析构
函数
顺序
① 调用派生类的
析构
函数
; ② 调用成员类对象的
析构
函数
; ③ 调用基类的
析构
函数
。 作者:阿秀 链接:https://zhuanlan.zhihu.com/p/349967745
构造
和
析构
函数
调用
顺序
一. 理论 1.
构造
函数和
析构
函数
①
构造
函数
构造
函数不能有返回值 缺省
构造
函数时,系统将自动调用该缺省
构造
...如果一个类中没有定义
析构
函数
,系统也会自动生成一个默认的
析构
函数
,为空函数,什么都不做 调用...
C++中
构造
函数和
析构
函数
常见面试题?
1、永远不要在
构造
函数或
析构
函数
中调用虚函数2、为什么
构造
函数不能定义为虚函数3、为什么
析构
函数
可以定义为虚函数4、
构造
函数的执行
顺序
?
析构
函数
的执行
顺序
?5、
构造
函数的执行
顺序
?
析构
函数
的执行
顺序
?参考 ...
C++ 语言
65,186
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章