Username: Password:

怎样得到constructor 和 copy constructor 执行次数
来源:作者: 发布时间:2007-12-05 06:22:23

 
我们知道,编译器在构造一个对象的时候,需要调用 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
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<
cout< }

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

在 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< }

有人要问,为什么要写 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 的结束。

喜欢本文,那就收藏到:

    Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网
相关评论  我也要评论
还没有关于此文章的相关评论!
  • 昵称: (为空则显示guest)
  • 评论分数: ★ ★ ★★★ ★★★★ ★★★★★
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  • 导航
    赞助商
    文章类别
    订阅