zoukankan      html  css  js  c++  java
  • C++---拷贝构造函数和赋值构造函数

    摘要:最近看了一道面试题问:C++ 中拷贝赋值函数的形参能否进行值传递?我知道一般来说,拷贝构造函数的形参必须是自身类型的引用(《面向对象程序设计--C++语言描述(第二版)》这本书中有叙述),但是拷贝赋值函数的形参通常也是自身类型的引用,那么我们到底能不能将它们的形参改为值传递呢?

    1,拷贝构造函数(不能进行值传递)

    拷贝构造函数的原型有两种:

    1 // 拷贝构造函数原型
    2 Person( Person& );  // method 1
    3 Person( const Person& );  // method 2
    4 
    5 // 下面这种原型是错的
    6 Person( Person );  // 不能进行值传递,只能传递引用

    不能进行值传递的原因:如果自身参数不是引用,则永远不会调用成功------为了调用拷贝构造函数,我们必须拷贝它的实参,但为了拷贝实参,我们又必须调用拷贝构造函数,如此无限循环。

    2,拷贝赋值函数(能进行值传递)

    拷贝赋值函数的原型:

    1 // 拷贝赋值函数原型
    2 Person& operator=( const Person& );

    为了与内置类型的赋值保持一致,赋值运算符通常返回一个指向其左侧运算对象的引用,这样就可以实现连等的功能(a = b = c)

    为了验证我们的猜测(能进行值传递),我们做了一下验证,代码如下:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 class A {
     5 public:
     6     A():a(0){}
     7     A(int k) {a = k;}
     8     A& operator=(A other){ // 进行值传递而非引用传递
     9         this->a = other.a;
    10     }
    11     int get(){return a;}
    12     ~A(){}
    13 private:
    14     int a;
    15 };
    16 
    17 int main(){
    18     A a1(1);  // a1.get() == 1
    19     A a2;  // a2.get() == 0
    20     a2 = a1;
    21     cout << a2.get() <<endl;
    22     return 0;
    23 }
    24 
    25 // 输出结果
    26 // 1
    赋值构造函数实例(值传递)
    所有博文均为原著,如若转载,请注明出处!
  • 相关阅读:
    uva 11294 Wedding
    uvalive 4452 The Ministers’ Major Mess
    uvalive 3211 Now Or Later
    uvalive 3713 Astronauts
    uvalive 4288 Cat Vs. Dog
    uvalive 3276 The Great Wall Game
    uva 1411 Ants
    uva 11383 Golden Tiger Claw
    uva 11419 SAM I AM
    uvalive 3415 Guardian Of Decency
  • 原文地址:https://www.cnblogs.com/zpcoding/p/10808547.html
Copyright © 2011-2022 走看看