zoukankan      html  css  js  c++  java
  • 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会禁止更改引用参数对象。

  • 相关阅读:
    Codeforces Round #417 C. Sagheer and Nubian Market
    linux 终端抓包命令
    计算机网络体系结构分析
    排序算法-快速排序
    排序算法-堆排序
    排序算法-希尔排序
    排序算法-插入排序
    排序算法-冒泡排序
    排序算法-选择排序
    杂谈:终端小工具
  • 原文地址:https://www.cnblogs.com/GuoYuying/p/11503350.html
Copyright © 2011-2022 走看看