zoukankan      html  css  js  c++  java
  • C++ 拷贝构造函数和拷贝赋值运算符的区别

    转自:https://www.cnblogs.com/wangguchangqing/p/6141743.html

    1.区别

    拷贝构造函数和赋值运算符的行为比较相似,都是将一个对象的值复制给另一个对象;

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

    拷贝构造函数也是一种构造函数,那么它的功能就是创建一个新的对象实例;赋值运算符是执行某种运算,将一个对象的值复制给另一个对象(已经存在的)。

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

    2.例子

    class Person
    {
    public:
        Person(){cout<<"无参构造函数"<<endl;}
        Person(const Person& p)
        {
            cout << "Copy Constructor" << endl;
        }
    
        Person& operator=(const Person& p)
        {
            cout << "Assign" << endl;
            return *this;
        }
    
    private:
        int age;
        string name;
    };
    
    void f(Person p)
    {
        return;
    }
    
    Person f1()
    {
        Person p;//无参构造函数
        return p;
    }
    
    int main(){
        Person p;          //无参构造函数
        Person p1 = p;    //  Copy Constructor
        Person p2;          //无参构造函数
        p2 = p;           //  Assign
        f(p2);            //  Copy Constructor
        cout<<"-----"<<endl;
        p2 = f1();        //  Assign
        cout<<"-----"<<endl;
        Person p3 = f1(); //
        return 0;
    } #输出: 无参构造函数 Copy Constructor 无参构造函数 Assign Copy Constructor ----- 无参构造函数 Assign ----- 无参构造函数

    唯一不明白的地方是最后一句,调用了f1内部创建了对象,打印“无参构造函数”,那么又赋值给p3,为什么没调用拷贝构造函数呢?不明白。

  • 相关阅读:
    LOJ 6089 小Y的背包计数问题 —— 前缀和优化DP
    洛谷 P1969 积木大赛 —— 水题
    洛谷 P1965 转圈游戏 —— 快速幂
    洛谷 P1970 花匠 —— DP
    洛谷 P1966 火柴排队 —— 思路
    51Nod 1450 闯关游戏 —— 期望DP
    洛谷 P2312 & bzoj 3751 解方程 —— 取模
    洛谷 P1351 联合权值 —— 树形DP
    NOIP2007 树网的核
    平面最近点对(加强版)
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/13886598.html
Copyright © 2011-2022 走看看