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

Posted

技术标签:

【中文标题】我有 2 个带有赋值运算符和复制构造函数的代码以及相同的驱动程序代码。但两者都给出不同的输出【英文标题】:I have 2 codes with Assignment operator and copy constructor and same driver code. But both are giving different output 【发布时间】:2021-12-22 12:30:56 【问题描述】:

代码 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 行)。 为什么要调用拷贝构造函数?

【问题讨论】:

【参考方案1】:

在第一个代码中,您的赋值运算符采用A 对象by (const) 引用,因此在每次赋值期间不需要创建新的A 对象。

在第二个代码中,您的赋值运算符采用anyArrayClass 对象按值,因此必须在每次赋值期间创建一个新的anyArrayClass 对象。而且由于anyArrayClass没有实现移动构造函数,所以使用了复制构造函数。

【讨论】:

以上是关于我有 2 个带有赋值运算符和复制构造函数的代码以及相同的驱动程序代码。但两者都给出不同的输出的主要内容,如果未能解决你的问题,请参考以下文章

在面试中,我要求编写构造函数、复制构造函数和赋值运算符

重载赋值运算符 - 多态容器

类包含复制构造函数和赋值运算符时的继承行为

链表:如何实现析构函数、复制构造函数和复制赋值运算符?

我应该删除内部创建线程的类的复制构造函数和赋值运算符吗?

如何利用模板复制&移动构造函数和赋值运算符?