• 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会禁止更改引用参数对象。

  • 相关阅读:
    注意 定义类的时候 不要null 别忘了new 实例化 否则报错
    如果通过key获取dictionary里面的value
    C#邮箱身份验证
    时间选择器 可以选择日期和时间
    C#的Timer解析
    使用微软的组件发邮件
    将html代码写入临时文件夹下面的 然后发来给webbrowser使用
    c#中DataGridView 如何设置 才能选中一行 设置鼠标事件
    lumisoft 获取邮件的方法
    C# 动态添加CheckedListBox的选项,并设置选项为 选中? 怎么做?
  • 原文地址:https://www.cnblogs.com/GuoYuying/p/11503350.html
Copyright © 2020-2023  润新知