提问人:Sachin Palande 提问时间:11/10/2021 最后编辑:user4581301Sachin Palande 更新时间:11/10/2021 访问量:67
我有 2 个带有 Assignment 运算符和复制构造函数的代码以及相同的驱动程序代码。但两者都给出了不同的输出
I have 2 codes with Assignment operator and copy constructor and same driver code. But both are giving different output
问:
我有 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 行)。 为什么它调用复制构造函数?
答:
1赞
Remy Lebeau
11/10/2021
#1
在第 1 个代码中,赋值运算符通过 (const) 引用获取对象,因此在每次赋值期间不需要创建新对象。A
A
在第 2 个代码中,赋值运算符按值获取对象,因此在每次赋值期间都必须创建一个新对象。由于没有实现移动构造函数,因此使用复制构造函数。anyArrayClass
anyArrayClass
anyArrayClass
评论