
c++ 一道题,求解释为什么错
这本书很好你看看上面有讲
陈树振 陈翼男 著
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;}
a传给b 一次拷贝构造函数
c(b)一次拷贝构造函数
return c 给临时变量temp(c)一次拷贝构造函数
d得到函数的返回的值,调用的是赋值运算符= ,d以temp实现的位拷贝。
题目是错的 应该是2次 和3次。
题目没错,是我错了拉
调用userCode(TestClass b)传参数调用了一次构造函数(因为你这是值传递,给被调用函数userCode传递了一份拷贝),TestClass c(b)第二次调用构造函数,return c也是值传递,第三次调用构造函数,同样是返回一份c的拷贝。
TestClass c(b);中, b传递到x
return c; 中 ,c传递到主函数的d
一共三次
3次那个没懂