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# XmlSerializer实现序列化浅析(转载)
    Direct3D学习(资料收集)
    幸福法则
    javascript中的keydown事件中的参数问题
    去除UTF8 BOM【转】
    JavaScript常用资料参考
    KCFinder CKEditor的文件管理器插件
    elFinder Web文件管理器
    用TcpTrace调试Web服务器
    Ubuntu 12.04如何登入root?
  • 原文地址:https://www.cnblogs.com/pjl1119/p/9653279.html
Copyright © 2011-2022 走看看