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
    赋值构造函数实例(值传递)
    所有博文均为原著,如若转载,请注明出处!
  • 相关阅读:
    cassandra复制到一个新机器编译失败的问题
    cassandra在服务端像leveldb一样进行插入初试成功
    git push不成功 insufficient permission for adding an object to repository database
    fuse进级
    fuse入门
    cassandra的写过程
    cassandra-执行请求入口函数
    cassandra-replication_factor 和 consistency level
    根据金额大小升序排序
    PL/SQL Developer连接本地Oracle 11g 64位数据库(转)
  • 原文地址:https://www.cnblogs.com/zpcoding/p/10808547.html
Copyright © 2011-2022 走看看