社区
C++ 语言
帖子详情
为什么析构函数必须无参数,为什么析构的顺序和构造的顺序相反???
fxbb
2006-10-03 09:19:55
我想请高手从较为底层的方面跟我解释一下我上面提出的问题,谢谢
...全文
932
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++
构造
函数和
析构
函数
的调用
顺序
派生类本身的
析构
函数
、对象成员
析构
函数
、基类
析构
函数
(与
构造
顺序
正好
相反
) 3、特例 局部对象,在退出程序块时
析构
静态对象,在定义所在文件结束时
析构
全局对象,在程序结束时
析构
继承对象,先...
构造
函数、
析构
函数
的执行
顺序
1)
构造
函数
顺序
① 基类
构造
函数。...2)
析构
函数
顺序
① 调用派生类的
析构
函数
; ② 调用成员类对象的
析构
函数
; ③ 调用基类的
析构
函数
。 作者:阿秀 链接:https://zhuanlan.zhihu.com/p/349967745
构造
和
析构
函数
调用
顺序
一. 理论 1.
构造
函数和
析构
函数
①
构造
函数
构造
函数不能有返回值 缺省
构造
函数时,系统将自动调用该缺省
构造
...如果一个类中没有定义
析构
函数
,系统也会自动生成一个默认的
析构
函数
,为空函数,什么都不做 调用...
构造
函数与
析构
函数
的调用
顺序
派生类本身的
析构
函数
、对象成员
析构
函数
、基类
析构
函数
(与
构造
顺序
相反
)
析构
函数
在下边3种情况时被调用: 1.对象生命周期结束,被销毁时(一般类成员的指针变量与引用都i不自动调用
析构
函数
); 2.delete指向...
【C/C++】继承中
构造
函数与
析构
函数
执行的
顺序
构造
函数执行
顺序
: 当派生类对象被创建时,首先会调用基类的
构造
函数,然后...
析构
函数
的调用
顺序
与
构造
函数的调用
顺序
相反
,先调用派生类自己的
析构
函数
,再依次回溯调用基类的
析构
函数
,直至最上层的基类的
析构
函数
C++ 语言
64,662
社区成员
250,487
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章