庞大资源库的计算机教程网站!
设为首页
加入收藏
总编信箱
投稿或申请专栏请先 [登 陆]
首页 操作系统 程序设计 图形图像 媒体动画 机械电子 WEB开发 数 据 库 办公系列 路由技术 网络原理 网络应用
认证考试 安全技术
首页>操作系统>Linux>编程开发>正文
资料搜索
Google搜索
Google
返回上级列表

推荐文章

快速保存网页中所有图片的方法
Windows中让光驱巧妙“隐身”技
防范非法用户入侵Win 2000/XP系
两款比较典型的ASP木马防范方法
有关表格边框的css语法整理
Windows XP中可以被禁用的服务
SQL Server导出导入数据方法
Javascript所有对象的属性的获
网页(HTML)中的特殊字符
与篮球共舞,尽显模式本色
QQ病毒的手工清除方法
Photoshop为极品美女打造性感睫
天衣无缝:IIS与PHP水火也相容
SQL Server存储过程编写和优化

如何得到constructor 和 copy constructor 执行次数

 作者:DarkSpy    日期:2005-4-14
字号选择〖 〗/ 双击滚屏 单击停止   
我们知道,编译器在构造一个对象的时候,需要调用 constructor,如果程序员本身没有定义constructor,在某种状况下则编译器会给你合成一个,如果我们的对象具有了memberwise 语意的时候,则编译器将会给你合成一个 operator= 和 copy constructor,编译器会进行 data member 的 copy 操作,作为一些不太知道C++内部运作的程序员来说,如何知道copy constructor执行了几次了呢?

不要企图使用简单的 int 来累加 constructor 和 copy constructor,如果 int 变量在类里面,则在constructor的时候就构造了一次,destructor的时候就析构掉了,就无法得出正确的执行次数,或许你会说:我可以把 int 定义为全局变量啊,试试看,我们绝对无法得出一个对象调用了几次constructor和copy constructor,而且数字出现偏差。

那该怎么办?

我们可以先定义一个简单的类,里面定义专有的操作,例如++操作符,和简单的constructor,

#include <iostream.h>
struct C
{
int count;
C():count(0) {}
int operator++(int) { return count+=1; }
// 重载++运算符
};

OK,定义好了这个基础的 count 类之后,我们可以开始我们的constructor试验。

我们首先定义一个叫 X 的类,里面定义constructor和copy constructor,在里面,利用前面定义的count类来进行累加数字:

class X
{
friend class C;
public:
C ct;
X():ct(*new C) { ct++;}
// constructor,初始化 ct 并开始累加
X(const X &o) { ct = o.ct; ct++;}
// copy constructor,将copy constructor 中 ct 的结果拷贝到 ct 中并累加
};

我们开始吧

main()
{
X x;
X a=x;
X b=a;
cout<<b.ct.count; /* 得到的这个数字就是对象 b 的 constructor 和 copy constructor 执行的次数 */

cout<<x.ct.count; /*就是对象 x 的constructor和copy constructor执行的次数*/
}

我们再来增加一点代码,再做个试验。

在 class X 后,我们再增加一个 X 的函数

X func(X &_this)
{
return _this;
}

无疑,这个函数也会调用 copy constructor,那么怎么得到他的次数呢?

main()
{
X x;
X a=x;
X b=a;
int i = func(b).ct.count;
cout<<i; /* 这个 i 就是用了 func 函数后得到的 constructor 和 copy constructor 执行的次数 */
}

有人要问,为什么要写 int i = func(b).ct.count; 而不直接写:func(b).ct.count; ?

因为 func 是一个类型为 X 的函数,而这个函数是要调用 copy constructor 的,而这个调用是在 return _this 之后,所以如果直接写:func(b).ct.count; 将会少一次累加,所以利用一个 int i 将得到完全执行完毕的 func 函数调用的 constructor 和 copy constructor。

在 X 类里面,我们友元了类 C,C 的对象 ct 在 X 对象构造的时候初始化,然后开始累加,ct 的生命周期将保持到类 X 的结束。
上一篇:覆盖 GNU C 库轻而易举    下一篇:一个Message-Driven Bean的示例  
[发送给好友]  [关闭窗口]  [返回顶部]   转载请注明来源:www.it00.com   
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 原点 投稿作者: DarkSpy
信息来源: 网络 录入时间: 2005-4-14
关于我们 - 广告服务 - 版权申明 - 网站地图 - 联系方式 - 总编信箱 - 会员投稿