读书人

哪位高手能帮小弟我解释一上这个C++ 程

发布时间: 2013-01-08 14:02:14 作者: rapoo

谁能帮我解释一下这个C++ 程序


#include "iostream.h"
class CA
{
int* a;
public:
friend class CB;
CA(int x)
{
a=new int[5];
*a=x;
}
CA()
{
a=new int[5];
*a=0;
}
~CA()
{
cout<<"析构被调用"<<endl;
*a=*a-1;
}
int get_a()
{
return *a;
}
};
class CB
{
public:
int get(CA test)
{
return *test.a;
}
};
int main(int argc,char* argv[])
{
CA test(2);
CB test2;
cout<<test.get_a()<<endl;
cout<<test2.get(test)<<endl;
cout<<test2.get(test)<<endl;
return 0;
}

我觉的应该是输出 2,1,0 但却是输出2,2,1
[解决办法]
哪位高手能帮小弟我解释一上这个C++ 程序

上面是运行结果,解释如下:


CA test(2);
CB test2;
cout<<test.get_a()<<endl;
cout<<test2.get(test)<<endl;
cout<<test2.get(test)<<endl;


上面五个语句分别用1-5表示:

语句1实例化一个CA对象,在构造函数中声明了一个包含两个int元素的数组,其中将数组首元素初始化为2;语句2实例化一个CB对象,
语句3就是简单的调用CA的成员函数,返回数组第一个元素(return *a;)记住a既是数组名,又是数组首元素地址。
语句4使用CB的对象test2调用成员函数get(),并且以CA的对象test作为参数,这将调用拷贝构造函数,如果不理解拷贝构函数的话,就简单的认为生成了test的一个副本。当get执行完后,生成的副本将被析构,所以会调用test的析构函数,注意此时数组首元素的值减了个1。
语句5的功能和语句4是一样的,唯一的区别就是执行完后,副本析构之后,原始的test对象也需要析构。

[解决办法]
拿本c++ primer 啃吧
[解决办法]
勉强可以。
你明白了两件事:
1 值改变(析构)是get返回以后的事。
2 a的值确实被改变了。a 的地址是确实被传过去了。

但“缓冲区”就算了。

读书人网 >C++

热点推荐