我有 2 个带有 Assignment 运算符和复制构造函数的代码以及相同的驱动程序代码。但两者都给出了不同的输出

I have 2 codes with Assignment operator and copy constructor and same driver code. But both are giving different output

提问人:Sachin Palande 提问时间:11/10/2021 最后编辑:user4581301Sachin Palande 更新时间:11/10/2021 访问量:67

问:

我有 2 个带有 Assignment 运算符和复制构造函数的代码以及相同的驱动程序代码。但两者都给出了不同的输出。

代码 1:

//constructor, copy constructor, assignment operator and destructor
#include <iostream>
using namespace std;
class A
{
    int a;
    int *b;
public:
    //constructor
    A()
    {
        a=0;
        b = new int;

    }
    
    //Copy constructor
    A (const A& oldObj)
    {
        cout<<"copy ctor"<<endl;
        a = oldObj.a;
        b = new int;
        *b = *(oldObj.b);
    }
    
    //destructor
    ~A()
    {
        delete b;
    }
    
    //Assignment operator overloading
    void operator = (const A& obj)
    {
        cout<<"ass op"<<endl;
        a = obj.a;
        *b = *(obj.b);
    }
    
};


int main()
{
    A a1;
    A a2 = a1; //copy constructor
    
    A a3;
    a3 = a1;//assignment operator
}

代码 1 : 输出

copy ctor
ass op

代码 2


// Simple C++ program to demonstrate use of copy-and-swap
// idiom by improving above code.
#include <iostream>
#include <cstring>
using namespace std;

class anyArrayClass
{
    int size;
    int *ptr;
public:
    anyArrayClass(int s=0):size(s),ptr(size? new int[size]:nullptr) 
    {
        //cout<<"default ctor"<<endl;
        }

    // Copy constructor
    anyArrayClass(const anyArrayClass& obj):size(obj.size),
                        ptr(size? new int[size]:nullptr)
    {
        cout<<"copy ctor"<<endl;
        memmove(ptr, obj.ptr, size*sizeof(int));
    }

    friend void swap(anyArrayClass& obj1, anyArrayClass& obj2)
    {
        cout<<"swap"<<endl;
        std::swap(obj1.size, obj2.size);
        std::swap(obj1.ptr, obj2.ptr);
    }
    
    // overloaded assignment operator
    // argument passed by value. calls copy ctor
    anyArrayClass& operator=(anyArrayClass obj) 
    {
        cout<<"assignment"<<endl;
        // calling friend function
        swap(*this, obj);
        return *this;
    }

    ~anyArrayClass()
    {
        delete[] ptr;
    }
};

int main()
{
    anyArrayClass obj1;
    anyArrayClass obj2 = obj1;//copy
    
    anyArrayClass obj3;
    obj3 =obj1;//assignment
}

代码 2 输出:

copy ctor
copy ctor
assignment
swap

在代码 2 中,最后 3 行输出来自赋值运算符调用(第 55 行)。 为什么它调用复制构造函数?

C++ OOP 指针 复制构造函数 赋值运算符

评论


答:

1赞 Remy Lebeau 11/10/2021 #1

在第 1 个代码中,赋值运算符通过 (const) 引用获取对象,因此在每次赋值期间不需要创建新对象。AA

在第 2 个代码中,赋值运算符按值获取对象,因此在每次赋期间都必须创建一个新对象。由于没有实现移动构造函数,因此使用复制构造函数。anyArrayClassanyArrayClassanyArrayClass