首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我有2个代码与赋值运算符和复制构造函数和相同的驱动程序代码。但两者的输出是不同的

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

Stack Overflow用户
提问于 2021-11-09 19:53:26
回答 1查看 39关注 0票数 0

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

代码1:

代码语言:javascript
复制
//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:输出

代码语言:javascript
复制
copy ctor
ass op

代码2

代码语言:javascript
复制
// 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输出:

代码语言:javascript
复制
copy ctor
copy ctor
assignment
swap

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

EN

回答 1

Stack Overflow用户

发布于 2021-11-09 20:40:47

在第一段代码中,赋值运算符通过(const)引用获取A对象,因此不需要在每次赋值过程中创建新的A对象。

在第二段代码中,赋值操作符通过值获取anyArrayClass对象,因此在每次赋值时都必须创建一个新的anyArrayClass对象。由于anyArrayClass不实现移动构造函数,因此使用复制构造函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69904284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档