首页
|
新闻
|
论坛
|
博客
|
专题
|
FTP
|
金融
|
微博
|
图库
|
MyHome
|
搜索
|
登陆
|
注册
|
帮助
|
设为首页
·
在线人数:
4105
§您的位置:
文逸首页
>
chinesedragon 's home
>
【理论研究】专栏
> 只能用new生.
chinesedragon 的主页网址:http://wonyen.net/home.aspx?id=chinesedragon
给我留言
§ chinesedragon
的【
理论研究
】专栏
作者:
chinesedragon
发表时间: 2005/12/3 13:40:12 查看: 5690 评论: 6
标题:
只能用new生成的对象
只能用new生成的对象
用new生成的对象,在面向对象中是很有用的.它保存在堆上,可以自由控制生命周期。
但如何保证一个对象只能在堆上生成呢?
答案其实也很简单,只需把析构函数定义为私有成员。例如OnlyCanBeNew类定义。
1| class OnlyCanBeNew
2| {
3| ~OnlyCanBeNew(){}
4| public:
5| OnlyCanBeNew(){}
6| };
原因呢,C++是一个静态绑定的语言。在编译过程中,所有的非虚函数调用都必须分析完成。即使是虚函数,也需检查可访问性。因些,当在栈上生成对象时,对象会自动析构,也就说析构函数必须可以访问。而堆上生成对象,由于析构时机由程序员控制,所以不一定需要析构函数。
保证了不能在栈上生成对象后,需要证明能在堆上生成它。这里OnlyCanNew与一般对象唯一的区别在于它的析构函数为私有。delete操作会调用析构函数。所以不能编译。那么如何释放它呢?
答案也很简单,提供一个成员函数,完成delete操作。在成员函数中,析构函数是可以访问的。当然detele操作也是可以编译通过。
7| void OnlyCanBeNew::Destroy()
8| {
9| delete this;
10| }
回到起点,如果需要再在栈上使用这个对象,怎么办呢。那就要用到包装了。类似Wrap类这样的类,如果它与OnlyCanBeNew接口的一样。那么在栈上使用它,就与使用OnlyCanBeNew一样了。
11| #include <stdio.h>
12|
13| class Wrap;
14| class OnlyCanBeNew
15| {
16| friend class Wrap;
17| ~OnlyCanBeNew(){}
18| public:
19| OnlyCanBeNew(){}
20| void Destroy()
21| {
22| delete this;
23| }
24| };
25|
26| class Wrap
27| {
28| OnlyCanBeNew *p;
29| public:
30| Wrap(): p(new OnlyCanBeNew)
31| {
32| }
33|
34| ~Wrap()
35| {
36| p->Destroy();
37| }
38|
39| };
测试代码如下:
40| int main(int argc, char *argv[])
41| {
42| OnlyCanBeNew one; //编译错误
43|
44| Wrap some; //OK
45| OnlyCanBeNew * p = new OnlyCanBeNew; //OK
46|
47| p->Destroy(); //释放
48| printf("Hello, world\n");
49|
50| return 0;
51| }
分享到:
【
管理日志
】【
我要评论
】
§
评论: 只能用new生成的对象
回复者:
icando
回复时间:2005/12/4 18:56:50 [第1评]
呵呵 wrap 是在栈上使用那个对象吗?
【
管理评论
】【
我要评论
】
回复者:
腾讯
回复时间:2011/11/20 18:18:02 [第2评]
QQ抽奖
QQ抽奖活动
腾讯周年挖宝行动是真的吗
腾讯公司有抽奖活动吗
QQ中奖是真的吗
腾讯中奖是真的吗
【
管理评论
】【
我要评论
】
回复者:
王博
回复时间:2012/7/24 22:16:51 [第3评]
要求大家点击一下查看这些不法分子!
星光大道抽奖活动
星光大道官方网站
星光大道中奖查询网
星光光大道中奖是真的吗
QQ信封
【
管理评论
】【
我要评论
】
共
3
条评论; 每页显示 15 条评论;
1
/
1
↑到页首
您未登陆,发表评论时请填写:用户名
*
密码
*
注册新用户
评论: 只能用new生成的对象
内容
(8000字以内)
(CTRL+ENTER提交)
关闭窗口
用户登陆
我要发表文章
搜 索
§chinesedragon 的网志导航
【
感想随笔
】
(4)
【
生活休闲
】
(0)
【
饮食健康
】
(0)
【
自然妙趣
】
(1)
【
潮流时尚
】
(0)
【
游览见闻
】
(0)
【
情感绿洲
】
(6)
【
娱乐搞笑
】
(4)
【
读图时代
】
(3)
【
影音视听
】
(4)
【
商业新知
】
(0)
【
理论研究
】
(6)
【
时事纵横
】
(13)
【
社会文化
】
(15)
【
文学欣赏
】
(3)
【
教育学习
】
(15)
§chinesedragon 的友情链接
爱国者
linux伊甸园
huangse
中秋节快乐
lupa开源
lupa首页
专业电脑书籍
/solotony/
关于文逸
|
小文论坛
|
文逸博客
|
文逸金融
|
精华文章
|
网站地图
| 联系我们 |
隐私保护
Copyright©
WWW.WONYEN.NET
2003 - 2021
闽ICP备09016518号-16
闽公网安备 35020502000004号
本站最高 10508 人同时在线,发生时间 2005-5-17 5:09:15
文逸科技
制作维护