为什么c++不允许取构造函数和析构函数的地址

htqx 2007-02-11 01:47:34

原因和绕过的方法.
...全文
1230 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
kcn83 2008-01-22
  • 打赏
  • 举报
回复
允许啊,怎么会不允许 ,你要去构造函数地址 ,你就在 调用构造函数时 ,也就是在创建一个对象时 ,就可以接下来取其地址。析构函数也一样。
guanwl 2008-01-22
  • 打赏
  • 举报
回复
用的场合还是有的
我现在就在用
_17708668 2007-02-27
  • 打赏
  • 举报
回复
获取函数地址的目的无非是想显示调用它.
ctor 和 dtor 当然是不能显示调用的.为了以防万一,标准要求编译器不允许获取这二者的地址.

至于楼主为啥提出这个问题,沙发上的兄弟应该算是给出了合适的答案.
Oversense 2007-02-21
  • 打赏
  • 举报
回复
手上没有标准,回头在看
htqx 2007-02-13
  • 打赏
  • 举报
回复
暴力暴力...
jeelypine 2007-02-13
  • 打赏
  • 举报
回复
taodm 2007-02-13
  • 打赏
  • 举报
回复
不如先说说,你如果得到了地址,你怎么使用这个地址吧。
双杯献酒 2007-02-13
  • 打赏
  • 举报
回复
这两个函数没有返回值
p_zyh 2007-02-13
  • 打赏
  • 举报
回复
没有需要使用这两个函数地址的场合(必须使用,或者有足够的好处)
所以没有为此定义特殊的语法
taodm 2007-02-12
  • 打赏
  • 举报
回复
那,不如说说为什么需要取构造函数和析构函数的地址吧。
healer_kx 2007-02-12
  • 打赏
  • 举报
回复
就我看汇编,似乎ctor和析构也没有啥特别的吧?

你取不到地址,是因为方法不对吧?。
htqx 2007-02-12
  • 打赏
  • 举报
回复
我说的绕过的方法,指的是绕过语法的限制,获得函数的地址.
htqx 2007-02-12
  • 打赏
  • 举报
回复
应用基于存在,不存在你喜欢说他没有应用何以服众.

先给个绕过的方法再说吧.
qhgary 2007-02-12
  • 打赏
  • 举报
回复
尽量不要在构造函数和析构函数中写代码,而是把代码放到另外的函数中,在构造函数和析构函数中调用.一来可以复用这些代码,而来可以实现多态.

当然不是绝对的,有些代码必须在构造和析构中写的除外,我只是说尽可能少一些.
fflush 2007-02-12
  • 打赏
  • 举报
回复
原因:
构造函数是c++提供的使类成为一个逻辑实体,而不是一个简单的结构体的一种机制。c++提供了面向对象的机制,而面向对象的一个核心思想是封装,如果别人为你构造了一个精良的黑盒子,而你非得要把黑盒子扯破,那游戏就玩不下去了

绕过的方法:
不使用c++,使用c
todototry 2007-02-12
  • 打赏
  • 举报
回复
mark
taodm 2007-02-12
  • 打赏
  • 举报
回复
绕过方法比较简单:厂方法。
taodm 2007-02-12
  • 打赏
  • 举报
回复
不知道,没研究。
wingfiring 2007-02-12
  • 打赏
  • 举报
回复
补充一下第二点:
可以存在和T& ctor(void * self)同样原型的普通函数(或等价的成员函数)。但是,在语义上,所有的这些函数,都必须工作在一个完好的对象上,而ctor恰恰相反,只能工作在尚未建立好对象的内存上。

假设,我们允许一些普通函数可以工作在未完工的对象上,那么就是多构造的语义了,这超出了C++支持的风格(语言不直接支持,但是可以模拟,std::allocator::construct就是一例).因为C++类的数据成员是定死了的,貌似即使支持这种风格,威力也有限的很.
wingfiring 2007-02-12
  • 打赏
  • 举报
回复
假设一个无参数的类型T,它的构造函数T(),可以看作是函数 T ctor().考虑栈对象和堆对象,实际上构造函数T()应该具备如下形式: T& ctor(void * self);因此,构造函数理论上可以存在.然而,缺乏实际的使用意义.
第一,placement new 提供了调用ctor的方法(new (pos) T),析构函数也是可以显式调用的(obj::~T());那么,如果你需要调用,直接调就是了.
第二,对于T& ctor(void * self);有没有和它形式相同的构造函数了?没有!你不可能再定义出一份同样函数原型的ctor(),换句话说,只要你知道构造函数的原型,就知道是哪个具体的函数了.
第三,即便借助类型转换,把不同类型的ctor统一调用,在建立self所指内存之前,也必须知道调用那个类型的构造函数,才好提供合适大小的内存,也就是说,即使你统一了构造函数的调用,调用前仍然有足够的信息判断出构造函数是具体的那个函数.因此,这种统一存储完全是多余的.
基本上,在C++的范围内,没有什么很好的理由必须要取构造函数地址。至于析构函数,delete和自动析构,可以处理所有的析构函数,更没有必要了。
加载更多回复(8)

64,637

社区成员

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

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