经典指数          
原因
667
浏览数
0
收藏数
 

不考虑任何编译器优化(如:NRVO),下述代码的第10行会发生
#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
  • 一次默认构造函数,一次拷贝构造函数,一次析构函数,一次(拷贝赋值运算符)operator=
  • 二次拷贝构造函数,一次析构函数
  • 一次(拷贝赋值运算符)operator=,一次析构函数
  • 一次拷贝构造函数,一次析构函数,一次(拷贝赋值运算符)operator=

     举报   纠错  
 
切换
1 个答案
D  zray4u说得不完全对 大家可以去自己调试一下 答案是D 但是次序并不是  一次拷贝构造函数,一次析构函数,一次(拷贝赋值运算符)operator= 而是 一次拷贝构造函数,一次(拷贝赋值运算符)operator= ,一次析构函数 1.一次拷贝构造函数发生在func函数调用完成,返回B类型的对象时,因为返回的不是引用类型,所以会生成一个对象,不妨称为TEMP,将返回的对象通过拷贝构造函数复制给TEMP,由于拷贝构造函数的参数是const B&,rhs并不会在函数结束时候被析构,这时并不调用析构函数; 2.赋值运算符在func函数执行完成后,将上面提到的TEMP,通过赋值运算符赋值给b2; 3.这句表达式的最后将临时对象TEMP进行析构; 可以试一试将B func(constB& rhs) 改为B func(constB rhs),rhs才会被析构;
 
切换
撰写答案
扫描后移动端查看本题