首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-07-04 
一道C++题目,麻烦各位看看# include fstream# include string# include iostreamusing namespace st

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


# 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
不知道为什么,能帮我讲解一下吗?感激不尽,先谢过
[解决办法]
这还不简单么。
第一句: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并打印。

[解决办法]
在C++中,下面三种对象需要调用拷贝构造函数(有时也称“复制构造函数”): 
1) 一个对象作为函数参数,以值传递的方式传入函数体;//f(t);
2) 一个对象作为函数返回值,以值传递的方式从函数返回;
3) 一个对象用于给另外一个对象进行初始化(常称为复制初始化);//Test t2 = t;
[解决办法]
其它输出的没什么好解释的。。就解释一下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。。
}


[解决办法]
添加复制构造函数
Test(const Test&)
    {
        printf("in copy\n");
    }

热点排行