一道C++题目,麻烦各位看看

langzi_1949 2013-06-11 09:35:28

# include <fstream>
# include <string>
# include <iostream>
using namespace std;
ofstream out("Test.out");

class Test
{
static int objectCount;
public:
Test()
{
objectCount++;
}
static void print(const string & msg ="")
{
if(msg.size()!=0)
cout<<msg<<":";
cout<<"objectCount ="<<objectCount<<endl;
}
~Test()
{
objectCount--;
print("~Test()");
}
};

int Test::objectCount =0;

Test f(Test t)
{
t.print("t argument inside f()");
return t;
}

int main()
{
Test t;
t.print("after construction of t");
Test t2 =f(t);
t2.print("after call to f()");
return 0;
}


为什么结果是:
after construction of t:objectCount =1
t argument inside f():objectCount =1
~Test():objectCount =0
after call to f():objectCount =0
~Test():objectCount =-1
~Test():objectCount =-2
不知道为什么,能帮我讲解一下吗?感激不尽,先谢过
...全文
144 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
bewinged 2013-06-11
  • 打赏
  • 举报
回复
添加复制构造函数
Test(const Test&)
    {
        printf("in copy\n");
    }
hugett 2013-06-11
  • 打赏
  • 举报
回复
其它输出的没什么好解释的。。就解释一下objectCount的变化吧。。

# include <fstream>
# include <string>
# include <iostream>
using namespace std;
ofstream out("D:\\Test.out");

class Test
{
	static int objectCount;
public:
	Test()
	{
		objectCount++;
	}
	static void print(const string & msg ="")
	{
			if(msg.size()!=0)
				cout<<msg<<":";
			cout<<"objectCount ="<<objectCount<<endl;
	}
	~Test()
	{
		objectCount--;
		print("~Test()");
	}
};

int Test::objectCount =0;

Test f(Test t)
{
	t.print("t argument inside f()");
	return t;
}

int main()
{	
	Test t;//这里调用默认构造函数构造t。。所以objectCount++了。。
	t.print("after construction of t");
	//这里首先调用复制构造函数用t初始化形参t。。然后形参t析构。。
	//然后用函数的返回结果,调用赋值构造函数初始化t2。。
	//由于这里都是用复制构造函数而不是默认构造函数Test()构造的对象。。所以objectCount没有增加。。
	Test t2 =f(t);
	t2.print("after call to f()");
	return 0;
	//最后析构t和t2。。objectCount变为-2。。
}
bewinged 2013-06-11
  • 打赏
  • 举报
回复
在C++中,下面三种对象需要调用拷贝构造函数(有时也称“复制构造函数”): 1) 一个对象作为函数参数,以值传递的方式传入函数体;//f(t); 2) 一个对象作为函数返回值,以值传递的方式从函数返回; 3) 一个对象用于给另外一个对象进行初始化(常称为复制初始化);//Test t2 = t;
Cool_ZyJ 2013-06-11
  • 打赏
  • 举报
回复
这还不简单么。 第一句:Test t;那么就 objectCount = 1了。 第二句:打印,没问题。 第三句:f(t),首先把t调进f( Test t ),这里用复制构造,所以没触发默认构造。所以没加。于是这个函数到末尾。把局部变量,也就是参数的t给删掉。于是就调用了objectCount--;所以这时候是0。然后他最后返回的t又和外部的t2做复制构造。所以还是没加。所以此时objectCount = 0; 第四句:打印,没问题。objectCount = 0了。 第五句:返回。 最后:程序结束。两个局部变量被析构。先析构t2,所以objectCount--;所以objectCount = -1并打印。然后t又被析构,所以objectCount--;所以objectCount = -2并打印。

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧