电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 服务器
如何得到constructor 和 copy constructor 执行次数
作者:未知 点击:0
  西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!虚拟主机可在线rar解压,自动数据恢复设置虚拟目录等.虚拟主机免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:[1] 
 
我们知道,编译器在构造一个对象的时候,需要调用 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 的结束。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·LINUX学习笔记--FTP服务器设置篇
·在内核2.6.0-test中安装最新驱动NVIDIA 1.0-4620(共三种方法)
·无软驱和光驱安装Redhat方法
·如何通过PXE的方式远程安装linux(本地无 光 , 软驱)
·网络安装的一点实践
·VI 快速上手
·Linux下Apache并发连接数和带宽控制
·轻轻松松的安装Slackware Linux -- 5.其他非标准安装程序解析
·在Linux下建立强大的FTP搜索引擎(二
·Iptables来限制上QQ

最新文章
·造成服务器不稳定的因素有以下七点
·机房是海外服务器安全稳定重要因素
·UniCache 行业垂直门户网站加速方案
·VPS服务器是主机业务的革命性技术
·如何选好虚拟主机的五个关键细节
·虚拟化技术会造成服务器市场的低迷吗?
·IP KVM打造“保姆”服务的IDC机房
·服务器能耗吞噬资源 优化数据中心
·ASP.NET2.0服务器控件之捕获回传事件
·服务器虚拟化必须考虑的十大重要因素


 
 


版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号