社区
C++ 语言
帖子详情
为什么c++不允许取构造函数和析构函数的地址
htqx
2007-02-11 01:47:34
原因和绕过的方法.
...全文
1230
28
打赏
收藏
为什么c++不允许取构造函数和析构函数的地址
原因和绕过的方法.
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
C++
语言基础视频教程
C++
语言基础视频培训课程:本课与主讲者在大学开出的程序设计课程直接对接,准确把握知识点,注重教学视频与实践体系的结合,帮助初学者有效学习。本教程详细介绍
C++
语言中的封装、数据隐藏、继承、多态的实现等入门知识;主要包括类的声明、对象定义、
构造函数
和
析构函数
、运算符重载、继承和派生、多态性实现等。课程需要有C语言程序设计的基础(可以利用本人开出的《C语言与程序设计》系列课学习)。学习者能够通过实践的方式,学会利用
C++
语言解决问题,具备进一步学习利用
C++
开发应用程序的基础。
c++
构造函数
和
析构函数
一、
构造函数
和
析构函数
的特点
构造函数
和
析构函数
是一种特殊的公有成员函数,每一个类都有一个默认的
构造函数
和
析构函数
;
构造函数
在类定义时由系统自动调用,
析构函数
在类被销毁时由系统自动调用;
构造函数
的...
C++
构造函数
和
析构函数
详解
C++
中用
构造函数
和
析构函数
来初始化和清理对象,这两个函数将会被编译器自动调用。对象的初始化和清理是非常重要的,如果我们不提供
构造函数
与
析构函数
,编译器会自动提供两个函数的空实现。............
C++
篇----
构造函数
和
析构函数
构造函数
和
析构函数
C++
构造函数
和
析构函数
一、什么是
构造函数
和
析构函数
c++
利用了**
构造函数
**和**
析构函数
**解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作。 对象的初始化和清理工作是编译器强制要我们做的事情,因此如果**...
C++ 语言
64,637
社区成员
250,559
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章