我有2个代码与赋值运算符和复制构造函数和相同的驱动程序代码。但两者给出的输出是不同的。
代码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行)。为什么要调用复制构造函数?
发布于 2021-11-09 20:40:47
在第一段代码中,赋值运算符通过(const)引用获取A对象,因此不需要在每次赋值过程中创建新的A对象。
在第二段代码中,赋值操作符通过值获取anyArrayClass对象,因此在每次赋值时都必须创建一个新的anyArrayClass对象。由于anyArrayClass不实现移动构造函数,因此使用复制构造函数。
https://stackoverflow.com/questions/69904284
复制相似问题