为什么类的拷贝构造函数的参数必须是引用

转载 2012年03月31日 15:48:14
  为什么类的拷贝构造函数的参数必须是引用(解决方法来源与CSDN
(1)      我首先想如果传值为什么不可以呢,传值可以完成所有的数据成员的复制工作啊。原因在与这个函数本身是个拷贝构造函数,是用来初始化别的新的对象的。
例如:
T&   operator=(T   t); 
 那么我们调用 
 T   t1; 
 T   t t1;时,拷贝构造函数被调用, 
当我们传值t1的时候,我们在函数里面操作的都是一个临时的对象,要在运行栈里面复制一个副本t2,但是这个临时对象的创建也要调用自身这个拷贝构造函数,因此在上面的那个拷贝构造函数的第一次调用内部又再一次调用自身:
 T t(t1)
{ //伪代码
 T t2(t1);
//从这里才是开始用户定义的其他的复制工作
}
T t2=t(t1).来产生函数里面的对象副本t2,这就导致了一个死循环,t2的构造过程中又要调用自身这个拷贝构造函数:
就像下面的情况:
 
T t(t1)
{ //伪代码
 T t2(t1)
{//这里也是先调用本身拷贝一个副本t3
 T t3(t1)
    {//再调用本身拷贝一个副本t4;
     ……………………
//从这里才是开始用户定义的其他的复制工作
}
这样看来,调用要无止境了,所以是不能传值的
第一个问题解决;
 
(2)我又想可以传指针啊,但是传指针是没有传引用方便和直观的
   但是这样用就麻烦了
例如:class T;
T t1;
      如果拷贝构造函数传指针那就要这样调用:
      T t2(&t1);
      现在只要这样就可以:
      T t2(t1);
由于赋值符的重载的实际上跟拷贝构造函数是一样的,此时更明显了//以下描述是错误的,赋值符的重载和拷贝构造函数是不一样的
    T t2=&t1;
    T t2=t1;哪个方便,当然是第二种。
   至此,第二个问题解决;



本文转自:http://blog.csdn.net/tangaowen/article/details/1701703

拷贝构造函数的类型为什么必须使用引用类型

有的看着理所当然的东西往往被我们忽略其深层的意义,就像c++ 拷贝构造函数的参数为什么必须是引用类型呢,许多初学者都会说,“为了减少一次内存复制呗!”(其实刚开始我也是这样想的),但究竟是不是这样呢?...
  • whoamiyang
  • whoamiyang
  • 2016年03月12日 00:05
  • 1259

c#中的捕获派生类异常

在尝试捕获涉及基类和派生类的异常类型时要注意catch子句的排序方式,因为基类的catch子句也会匹配它的任何派生类。例如,由于所有异常的基类都是Exception,因此带有catch的Excepti...
  • hemeinvyiqiluoben
  • hemeinvyiqiluoben
  • 2013年12月03日 15:39
  • 1918

909422229__XML的实体引用

先看xml的文档结构: 1,XML声明 xml文档是由一组使用唯一名称标识的实体组成的。始终以一个声明开始,这个声明指定该文档遵循XML1.0的规范。XML也有一种逻辑结构,在逻辑上,文档的组...
  • a909422229
  • a909422229
  • 2016年09月06日 18:47
  • 723

"非常量引用的初始值必须为左值"

非常量引用的初始值必须为左值
  • u013478518
  • u013478518
  • 2017年06月07日 11:52
  • 2022

C++函数参数之 引用传递和值传递

从概念上讲。指针从本质上讲就是存放变量地址 的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。 而引用是一个别名,它在逻辑上不是独立的,它 ...
  • wkdwkdd
  • wkdwkdd
  • 2014年09月13日 14:20
  • 1033

非静态成员引用必须与静态成员相对

文章转载自:http://blog.csdn.net/shenqi67/article/details/7533094 Instance成员和static成员(p318) 实例变量/函...
  • u011499425
  • u011499425
  • 2016年09月30日 17:20
  • 1442

你不知道的SpringMVC——@RequestParam必须要加上参数名

Spring现在是一个非常火的词,但凡你看到的一个东西,都会发现一句提供与Spring集成这样的字样,那么在SpringMVC这块,它又为大家埋下了什么坑呢?         SpringMVC结合...
  • jianxin1009
  • jianxin1009
  • 2015年02月10日 22:07
  • 8501

Java中,String类型和包装类型作为参数传递时,是属于值传递还是引用传递呢?

原理知识: 如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的 值不会改变原始的值. 如果参数类...
  • wuya814070935
  • wuya814070935
  • 2015年10月19日 15:39
  • 3651

使用父类方法一定要用super吗(写给新人)

今天,在群里有人问(估计是新手)。答案,不一定。只有当子类重写了父类的方法时,如果需要用到父类的方法时,才要用super,表明这个方法时父类的方法不是子类的方法。不理解?上代码: Father类 ...
  • doye_chen
  • doye_chen
  • 2017年12月24日 21:10
  • 53

为什么匿名内部类中引用的局部变量和参数需要final而成员字段不用?

http://www.blogjava.net/DLevin/archive/2011/11/23/364599.html 昨天有一个比较爱思考的同事和我提起一个问题:为什么匿名...
  • wwww4
  • wwww4
  • 2015年07月02日 20:51
  • 1084
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:为什么类的拷贝构造函数的参数必须是引用
举报原因:
原因补充:

(最多只允许输入30个字)