今天看到这么一个面试题:请分析下面代码的编译运行结果,并提供三个选项:A 编译错误 B 编译成功,运行是崩溃 C 编译运行正常,输出10
class aa
{
private:
int value;
public:
aa(int n) { value = n; }
aa(aa other) { value = other.value; }
void print() { cout << value << endl; }
};
int main()
{
aa val_1 = 10;
aa val_2 = val_1;
val_2.print();
return 0;
}
粗一看,好像没什么问题,我在vc6.0上测试了下,发现编译不过,显示复制构造函数非法,当时很不明白,细想了一下,发现问题出在传递的这个参数other上。复制构造函数作用时,因为other是值传递,所以会生成实参的副本,生成副本的过程就又会调用复制构造函数,这就是对自身的调用,就会导致对自身的无限调用,从而导致栈溢出。正确的做法将参数改成 const aa & other.
细节决定成败啊