c++ 一道题,求解释为什么错

 我来答
chujiangke001
2013-06-17 · TA获得超过1605个赞
知道小有建树答主
回答量:1352
采纳率:0%
帮助的人:718万
展开全部

这本书很好你看看上面有讲 

陈树振 陈翼男 著

C++释难解惑

pdf 44页书太好了。


现在调用函数 fun()。语句1里的变量 val 是一个 auto 型变量,它存储在栈里的 fun()函数

的数据现场里,当函数 fun()执行完毕后,它就要从栈里弹出而失去生命,它不可能被带到主

调函数里去,那么,系统是怎么做的呢?

第一步:在先前预留出来的 sizof(int)个字节的那一小块存储里建立一个临时的、匿名的

变量,我们不妨称这个变量为 temp,此时 temp 要被返值表达式 val 的值初始化。我们设想一

下,假设函数的返值是对象,那么此时务必会调用构造函数初始化 temp 的;

第二步:函数 fun()执行结束,auto 型变量 val 被弹出。

第三步:用 temp 的值赋值给主调函数的 result,同时立即结束 temp 的生命。假设函数的

返回是对象,在消亡这个 temp 时,就自动调用析构函数。

返值是对象的一个函数例子如下:

MyClass

{

fun(....)

MyClass obj;

:

return

obj;

}

在上例中,函数的返值是对象,而 return 语句中的表达式也是本类的对象,此时初始化

匿名的、临时的对象 temp 时,要自动调用的构造函数应该是复制构造函数。

一般来说,return 语句中的表达式不一定是单个对象,这时候初始化 temp 要自动调用的

是具有相应形参的构造函数。

在该临时对象的生存结束时,同样也要调用析构函数。

下例注释中的数字表示运行时执行步骤的前后顺序,对编译环境的调试器比较熟悉的读

者最好单步运行来验证:

例 3-3:

#include <iostream.h>

class Test{

private:

int n;

public:

Test()

{

n=0;

cout<<"The Constructor is called "<<n<<endl;

43构造函数和析构函数

}

Test(const Test& );

~Test();

};

Test::Test(const Test& source)

{ n=source.n+1;

cout<<"The copyConstructor is called"<<endl;

}

Test::~Test()

{ cout<<"The destructor is called "<<n<<endl;

}

Test fun()

//注意,此函数的返值是对象

{ Test obj;

//3,去调用无参构造函数

return obj;

//4,去调用复制构造函数用 obj 来生成临时对象

}

//5,去调用析构函数析构对象 obj

int main()

{ Test one;

//1,去调用无参构造函数生成对象 one

one=fun();

//2,去调用函数 fun //6,去调用析构函数析构临时对象

return 0;

//7,去调用析构函数析构对象 one

}

输出为:The Constructor is called 0

The Constructor is called 0

The copyConstructor is called

The destructor is called 0

The destructor is called 1

The destructor is called 1

从这个例子我们可以看到,当函数的返值是对象时,会多次调用构造函数和析构函数,

耗费很多时间。





///////////////////////////////////////////


d=usrCode(a);

estClass usrCode(TestClass b){TestClass c(b); cout<<"xiaojibahaha"<<endl;return c;}

  1. a传给b 一次拷贝构造函数

  2. c(b)一次拷贝构造函数

  3. return c 给临时变量temp(c)一次拷贝构造函数

  4. d得到函数的返回的值,调用的是赋值运算符= ,d以temp实现的位拷贝。

  5. 题目是错的 应该是2次 和3次。

追问
题目没错,是我错了拉
JINLegend
2013-06-17 · TA获得超过802个赞
知道小有建树答主
回答量:241
采纳率:100%
帮助的人:134万
展开全部
原题目TestClass(const TestClass &x)提示了对象整份复制都会调用这个构造函数。
调用userCode(TestClass b)传参数调用了一次构造函数(因为你这是值传递,给被调用函数userCode传递了一份拷贝),TestClass c(b)第二次调用构造函数,return c也是值传递,第三次调用构造函数,同样是返回一份c的拷贝。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
宗谷寒石
2013-06-17
知道答主
回答量:30
采纳率:0%
帮助的人:28.1万
展开全部
d=usercode(a);中, 实参a传递到形参b

TestClass c(b);中, b传递到x
return c; 中 ,c传递到主函数的d
一共三次
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hu0904
2013-06-17 · TA获得超过222个赞
知道小有建树答主
回答量:510
采纳率:0%
帮助的人:471万
展开全部
单步跟踪看看,什么解释都比不上跟着执行步骤一步一步的看
追问
3次那个没懂
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式