为什么析构函数必须无参数,为什么析构的顺序和构造的顺序相反???

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)

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧