c/c++语言开发共享[转]为什么复制构造函数的参数需要加const和引用

[转]为什么复制构造函数的参数需要加const和引用 一.引言 1.0在解答这个问题之前,我们先跑个小程序,看下调用关系。 1.1【输出结果】 1.2【分析结果】 第一个输出: constructor with argument. //CExample aaa(2); 这里创建了变量aaa,在创建的 …


                                         [转]为什么复制构造函数的参数需要加const和引用

一.引言

1.0在解答这个问题之前,我们先跑个小程序,看下调用关系。

#include <iostream>  using namespace std;  class cexample  {  public:      cexample(int x) :m_ntest(x) //带参数构造函数      {          cout<< "constructor with argument."<<endl;      }      cexample(const cexample & ex) //拷贝构造函数      {          m_ntest = ex.m_ntest;          cout << "copy constructor."<<endl;      }      cexample& operator = (const cexample &ex)//赋值函数(赋值运算符重载)      {          cout << "assignment operator." << endl;          m_ntest = ex.m_ntest;          return *this;      }      void mytestfunc(cexample ex)      {      }  private:         int m_ntest;  };     int main()  {        cexample aaa(2);        cexample bbb(3);        bbb = aaa;        cexample ccc = aaa;        bbb.mytestfunc(aaa);        system("pause");        return 0;  }  

  

1.1【输出结果】

[转]为什么复制构造函数的参数需要加const和引用

1.2【分析结果】

第一个输出: constructor with argument.     //cexample aaa(2);

这里创建了变量aaa,在创建的同时还带有参数2,那就调用带参数的构造函数

第二个输出:constructor with argument.     //cexample bbb(3);

分析同第一个

第三个输出:assignment operator.                //bbb = aaa;

bbb之前已经创建了,所以这个不会调用构造函数,而只是将aaa赋值给bbb,所以调用赋值函数
第四个输出:copy constructor.                      //cexample ccc = aaa;

这个和上一个的区别就在于:bbb之前已经创建过了,而这里的ccc是在这条语句才创建的,所以这里是在创建ccc的同时将aaa赋值给ccc,所以这句调用的肯定是构造函数,又因为需要将aaa赋值给ccc,所以调用的是拷贝构造函数。

第五个输出:copy constructor.                     //  bbb.mytestfunc(aaa);
这里是调用了一个自己写的mytestfunc函数,其中这个函数中的参数没有采用引用,那就是值传递的方式。就是编译器先创建一个类型为cexample名称为ex的对象,然后将aaa的值传递给ex(值传递方式的特性),将相当于要执行一条cexample ex = aaa的语句。经第四个输出的分析可知,这需要调用拷贝构造函数。所以输出copy constrctor。

 

二.解答问题

2.1为什么要用引用?

  【错误答案】个人第一反应:为了减少一次内存拷贝。

  【正确答案】由上节的第五个输出分析可知,在执行bbb.mytestfunc(aaa);时,其实会调用拷贝构造函数。如果我们的拷贝构造函数的参数不是引用,那么在bbb.mytestfunc(aaa);时,调用cexample ex = aaa;,又因为ex之前没有被创建,所以又需要调用拷贝构造函数,故而又执行cexample ex = aaa;,就这样永远的递归调用下去了。

  所以, 拷贝构造函数是必须要带引用类型的参数的, 而且这也是编译器强制性要求的。

 

2.2为什么要用const?

  【正确答案】如果在函数中不会改变引用类型参数的值,加不加const的效果是一样的。而且不加const,编译器也不会报错。但是为了整个程序的安全,还是加上const,防止对引用类型参数值的意外修改。

 

——如有不对的地方,非常欢迎给予指导!

——【感谢】资料来源于https://www.cnblogs.com/engraver-lxw/p/7580403.html

——【感谢】资料来源于https://blog.csdn.net/tunsanty/article/details/4264738

——【感谢】资料来源于https://blog.csdn.net/sinat_36053757/article/details/70597567

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/605335.html

(0)
上一篇 2021年5月13日
下一篇 2021年5月13日

精彩推荐