拷贝构造函数和赋值构造函数

目录

拷贝构造函数和赋值构造函数能否进行值传递

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

赋值构造函数(可进行值传递)


拷贝构造函数和赋值构造函数能否进行值传递

  C++ 中拷贝赋值函数的形参能否进行值传递?我知道一般来说,拷贝构造函数的形参必须是自身类型的引用;但是拷贝赋值函数的形参通常也是自身类型的引用,实际上拷贝赋值函数能进行值传递。

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

拷贝构造函数具有如下两种形式:

// 拷贝构造函数原型

Person(Person&);  // method 1

Person(const Person&);  // method 2


// 下面这种原型是错的

Person(Person);  // 不能进行值传递,只能传递引用

不能进行值传递的原因:

  如果自身参数不是引用,则永远不会调用成功------为了调用拷贝构造函数,我们必须拷贝它的实参,但为了拷贝实参,我们又必须调用拷贝构造函数,如此无限循环,栈满,无法完成拷贝。

赋值构造函数(可进行值传递)

拷贝赋值函数的原型:

// 拷贝赋值函数原型

Person & operator=(const Person&);

为了与内置类型的赋值保持一致,赋值运算符通常返回一个指向其左侧运算对象的引用,这样就可以实现连等的功能(a = b = c)。为了验证我们的猜测(能进行值传递),我们做了一下验证,代码如下:

    class A {
    public:
        A() :a(0) {}
        
        //A(A other) { this->a = other.a; }//1.拷贝构造函数,报错
        A(A& other) { this->a = other.a; }
        A(const A& other) { this->a=a; }
        A(int k) { a = k; }
        A & operator=(A other) { // 进行值传递而非引用传递
            this->a = other.a;  
            return other;
        }
        int get() { return a; }
        ~A() {}
    private:
        int a;
    };
    
    void test()
    {
        A mya1(1);
        A mya2(mya1);
        A mya3;
        mya3=mya2 = mya1;
        cout <<mya3.get()<<","<< mya2.get() << endl;
    }

转载自:https://www.cnblogs.com/zpcoding/p/10808547.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值