美文网首页
为什么拷贝构造函数的参数一定要拷贝

为什么拷贝构造函数的参数一定要拷贝

作者: 奥利奥蘸墨水 | 来源:发表于2020-08-09 12:29 被阅读0次

测试

首先看测试用例:

#include <iostream>

using namespace std;

class Test{
public:
    Test():s("A"){}
    Test(string s):s(s){}
    Test(const Test &other){
        this->s = other.s;
        cout << "拷贝构造函数" << "+s:"<< other.s << endl;
    }
    void test(Test other){
        this->s = other.s;
        cout << "测试函数" << endl;
    }
    void print(){
        cout << s << endl;
    }

//    Test& operator=(Test other){
//        this->s = other.s;
//        cout << "等号的重载" << endl; 
//    }

    Test& operator=(const Test& other){
        this->s = other.s;
        cout << "等号的重载" << endl;
    }
private:
    string s;
};

int main(){
    Test A;
    Test B("B");
    A.print();
    B.print();

    A.test(B);
    A.print();

    Test C("C");
    A = C;
    A.print();
} 

运行结果:

A
B
拷贝构造函数+s:B
测试函数
B
拷贝构造函数+s:C
等号的重载

拷贝构造函数是否可以按值传递?

先分析一下这段代码,在Test类中有无参的构造函数,有参的构造函数,拷贝构造函数以及“=”的重载。

在输出中第一二个输出肯定是没有问题的,真正的重点要从第三个输出开始。可能乍一看不是很清楚第三个输出是怎么来的,但是细细分析还是可以猜出来的。
首先分析test这个函数,这个test函数的参数按值传参,那么在执行函数体之前会发生从实参到形参的一个转换,而这个转换要用到Test类的拷贝构造函数,即进行了Test(B)的一个操作,所以会存在第三行这样的输出。这样第四行和第五行的输出也就理所当然了。

结论

有了上面的分析我们就能解释为什么拷贝构造函数的参数只能使用引用了。因为如果拷贝构造函数的参数是按值传参,那么就会发生上面test函数那里发生的情况,调用拷贝构造函数,然后拷贝构造函数仍然是按值传参,那么继续调用拷贝构造函数,这样就会进入一个无限递归调用拷贝构造函数的bug。所以拷贝构造函数是必须按引用传递的。不按引用传递,直接编译不通过。

最后两行输出是“=”重载的一个测试,等号重载的参数是按照引用传递的,测试结果也与预期相符。

等号的重载是否可以按值传递?

现在将“=”重载函数换成被注释掉的按值传递的函数,结果也是能通过编译的,测试结果如下所示:

拷贝构造函数+s:C
等号的重载
C

从这个结果我们可以看到,从实参到形参形参的转换再次用了拷贝构造函数,其他部分没啥说的。

结论

所以说“=”号重载是可以用按值传递方式的,但是通常不采用,因为这样做会多以此拷贝,降低效率。

相关文章

  • C++语言基础(02)

    1.可变参数 2.构造函数、析构函数、拷贝构造函数 构造函数 拷贝构造函数 //浅拷贝(值拷贝)问题 //深拷贝

  • 13拷贝控制

    13拷贝控制 13.1拷贝、赋值与销毁 13.1.1拷贝构造函数 拷贝构造函数的第一个参数必须是引用类型。 使用拷...

  • C++的深拷贝与浅拷贝

    拷贝构造函数 拷贝构造函数是使用类对象的引用作为参数的构造函数,它能够将参数的属性值拷贝给新的对象,完成新对象的初...

  • 面向对象笔记(二)

    七:拷贝构造、拷贝复制、析构 1.编译器自动给的BIG THREE,其中默认拷贝构造函数、拷贝赋值函数(参数是本类...

  • GeekBand C++ 第二周

    7.三大函数:拷贝构造,拷贝赋值,析构 无指针的类,不需要写拷贝构造和拷贝赋值。类内带指针,一定要写拷贝构造和拷贝...

  • 博览网/boolan-C++面向对象高级编程(上)-第2周笔记

    2.1 拷贝构造函数 拷贝赋值运算符 析构函数 2.1.1拷贝构造函数 第一个参数必须是自身类类型的引用,且任何额...

  • c++primer 13.1-13.13

    13.1拷贝构造函数:构造函数写法,第一个参数为自身类类型的引用,,且任何额外参数都有默认值,则此构造函数是拷贝构...

  • C++面向对象高级编程(上)-第二周-博览网

    第二周 三大函数:拷贝构造,拷贝赋值,析构 字符串的构造函数,拷贝构造函数, 拷贝构造函数和拷贝赋值函数没有自主定...

  • (GeekBand)Second class

    一、Big Three:拷贝构造函数,拷贝赋值函数,析构函数 1.拷贝构造函数 文字定义:拷贝构造函数,又称复制构...

  • 017 拷贝构造函数

    如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数。 拷贝构造函...

网友评论

      本文标题:为什么拷贝构造函数的参数一定要拷贝

      本文链接:https://www.haomeiwen.com/subject/pasldktx.html