c++拷贝构造函数引用传参

看一道C++面试题:

给出下述代码,分析编译运行的结果,并提供3个选项: A.编译错误  B.编译成功,运行时程序崩溃  C.编译运行正常,输出10

class A

{

  private:

  int value;

  public:

  A(int n){ value = n;}

  A(A other){ value = other.value; }

  void Print(){ std::cout << value << std::endl; }

};

int main()

{

  A a = 10;

  A b = a;

  b.Print();

  return 0;

}

刚开始看到题的时候,我并没有看出猫腻,说实话,自己在C++这里还是个菜菜菜菜菜,如果要我选我会十分忐忑的选C,忐忑是因为知道C肯定不是对的,选C是因为自己又太菜看不出猫腻。

OK,正确答案是编译出错。

现在来解析一下这里的考点:拷贝构造函数传参问题,熟悉C++语法的大佬们都知道在拷贝构造函数A(A other)中有一个很明显的错误,就是形参,正确的形参应该是 const A& other,而不是 A other。

1.除了常量引用能节省空间外,这两个形参有什么区别吗?

  有区别,区别很大。我们都知道将实参传递给实参相当于把实参的值赋给形参。执行A b = a;时,会调用 b的拷贝构造函数,此时实参 a会被赋值给形参 other,相当于语句 A other = a; 又会继续调用other的拷贝构造函数,将 a赋值给对象other的拷贝构造函数的形参other,如此一来,就会形成一个递归操作而且没有结束条件,造成堆栈溢出。而C++不会允许这种错误发生,因此 A other做形参会编译错误。

  而const A& other就不一样,以引用做形参,并不会调用拷贝构造函数,所以正确。

2.为啥要加const

  如果在函数中不会改变引用参数对象的值,加不加const无所谓,但是为了程序的安全性着想,加上const会禁止更改引用参数对象。

 

posted @ 2019-09-10 22:02 _程序兔 阅读(...) 评论(...) 编辑 收藏