不考虑任何编译器优化(如:NRVO),下述代码的第10行会发生
1
2
3
4
5
6
7
8
9
10
11
|
#include <stdio.h>//1
class
B
//2
{
//3
};
//4
B func(
const
B& rhs){
//5
return
rhs;
//6
}
//7
int
main(
int
argc,
char
**argv){
//8
B b1,b2;
//9
b2=func(b1);
//10
}
//11
|
正确答案: D 你的答案: A (错误)
一次默认构造函数,一次拷贝构造函数,一次析构函数,一次(拷贝赋值运算符)operator=
二次拷贝构造函数,一次析构函数
一次(拷贝赋值运算符)operator=,一次析构函数
一次拷贝构造函数,一次析构函数,一次(拷贝赋值运算符)operator=
D
b2=func(b1);//10
一次拷贝构造函数发生在func函数调用完成,返回B类型的对象时,因为返回的不是引用类型,所以会生成一个对象,
不妨称为TEMP,将返回的对象通过拷贝构造函数复制给TEMP,然后,返回值所对应的对象会被析构。如果返回值是引用类型,
则不会调用拷贝构造函数。
赋值运算符在func函数执行完成后,将上面提到的TEMP,通过赋值运算符赋值给b2,值得注意的是赋值运算符重载函数如果不自己定义,
程序会认为是调用缺省的赋值运算符重载函数。
编辑于 2015-12-10 13:26:31
http://www.nowcoder.com/profile/380772/test/2198787/36698?onlyWrong=0