代码改变世界

c++之复制构造函数为何形参是引用传递

2012-04-21 15:49  javaspring  阅读(642)  评论(0)    收藏  举报

  在c++中,其实需要自己定义类的”复制控制的三大函数“--------要么是因为类的成员变量中有指针类型....要么就是有特殊的操作想要实施,所以你就想:“要不要自己定义一个复制构造函数呢?”.....

   复制控制的三大函数如同三国演义中的“刘关张三兄弟”.......扬名之战就只是-----虎牢关下逼退吕布(指针型的成员变量).......

   吕布同学很牛,谁一不小心就被他所伤......自从有了刘关张,事情就好多了,也就是这个原因.....大家见到刘关张就想起了吕布同学,而见到了吕布就想到哪哥三.....


   上面只废话只是告诉大家.....复制构造函数、赋值操作符、析构函数-----刘关张....不用编译器自动合成,而自己为何要自寻烦恼去自己定义.....--------1 有指针类型的成员变量 2 有自己的特殊操作

   

   正题: 为什么复制构造函数要用引用传递:

       Sale::Sale(const Sale rhs);

    上述定义之所以不能工作,是因为她试图以传值方式将实参传递给复制构造函数。但是,当以传值方式传递参数时,会导致调用复制构造函数,因此,如果要使用以传值方式

   必须要使用一个“不以传值方式传递参数”的构造函数,の.....假如要定义一个以传值方式传递参数的复制构造函数(Sale::Sale(const Sale rhs);),又要以另一个“不以传值方式传递参数”的复制构造函数,.....那不就是说: 你想要一个” Sale::Sale(const Sale rhs); “ ....就必须定义一个 ” Sale::Sale(const Sale& rhs); “........假如不提供:” Sale::Sale(const Sale& rhs); “......编译器就会一直纠缠着...直到有了一个以引用方式传递的复制构造函数....这就造成了一个死循环(无穷递归调用).....  综上所述: 只能把复制构造函数定义为一个引用方式传递实参的.......


当然,不一定是const类型......