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