zoukankan      html  css  js  c++  java
  • 什么时候调用:拷贝构造函数、赋值运算符

    class Person
    {
    public:
    
        Person(const Person& p);
    
        Person& operator=(const Person& p);
    
    private:
        int age;
        string name;
    };

    在默认情况下(用户没有定义,但是也没有显式的删除),编译器会自动的隐式生成一个拷贝构造函数和赋值运算符。

    但用户可以使用delete来指定不生成拷贝构造函数和赋值运算符,这样的对象就不能通过值传递,也不能进行赋值运算。

    Person(const Person& p) = delete;

    注意:拷贝构造函数必须以引用的方式传递参数。这是因为,在值传递的方式传递给一个函数的时候,会调用拷贝构造函数生成函数的实参。

    如果拷贝构造函数的参数仍然是以值的方式,就会无限循环的调用下去,直到函数的栈溢出。

    (不用引用,编译不能通过)

    何时调用

    拷贝构造函数和赋值运算符的行为比较相似,都是将一个对象的值复制给另一个对象;但是其结果却有些不同,

    拷贝构造函数使用传入对象的值生成一个新的对象的实例,而赋值运算符是将对象的值复制给一个已经存在的实例

    这种区别从两者的名字也可以很轻易的分辨出来,拷贝构造函数也是一种构造函数,那么它的功能就是创建一个新的对象实例;赋值运算符是执行某种运算,将一个对象的值复制给一个已经存在的实例

    调用的是拷贝构造函数还是赋值运算符,主要是看是否有新的对象实例产生。如果产生了新的对象实例,那调用的就是拷贝构造函数;如果没有,那就是对已有的对象赋值,调用的是赋值运算符。

    调用拷贝构造函数主要有以下场景:

    • 对象作为函数的参数,以值传递的方式传给函数。 
    • 对象作为函数的返回值,以值的方式从函数返回
    • 使用一个对象给另一个对象初始化
    A print(int n)
    {
        A a(1);
        return a;
    }
    
    A aa = print(2332);

    下方的示例一样,

    A print(int n)
    {
        A a(1);
        return a;
    }
    
    
    print(2332);

    不管有没有设置返回值,在返回时都会调用拷贝构造函数:

  • 相关阅读:
    c语言练习17——输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数
    c语言练习16——输入两个正整数m和n,求其最大公约数和最小公倍数
    c语言练习15——条件运算符的嵌套
    c语言练习14——将一个正整数分解质因数
    CentOS下Cassandra集群搭建
    一台linux服务器挂载另外一台linux服务器文件系统
    zabbix分布式监控多网段的部署与实现
    CentOS安装MySQL详解
    vcenter 7.0 安装 vRealize Operations Manager
    Zabbix分布式部署详细
  • 原文地址:https://www.cnblogs.com/pjl1119/p/9653279.html
Copyright © 2011-2022 走看看