面试题:
下面这段代码运行结果是什么?
A:编译错误;
B:编译成功,运行时程序崩溃;
C:编译正常运行,输出为10;
class A{
int value;
public:
A(int n){
value = n;
}
A(A other){
value = other.value;
}
void Print(){
std::cout << value << std::end1;
}
}
int _tmain(int argc, _TCHAR* argv[]){
A a = 10;
A b = a;
b.Print();
return 0;
}
关于这种题,一般不能用正常的思路去想这个问题。
运行结果:编译错误
1、复制构造函数A传入的参数是A的一个实例;
2、由于是传值参数,我们可以把形参复制到实参时,会调用复制构造函数;如果允许复制构造函数传值,就会在复制构造函数内,调用复制构造函数,就会形成永无休止的递归调用,从而导致栈溢出。
3、c++标准不允许复制构造函数,传值参数在visual studio和gcc中都将编译出错;
4、要解决这个问题,我们就需要把构造函数修改为常量引用。
A(const A &other)
//传值参数改成了常量引用`