提问人:alan.chen 提问时间:7/29/2012 最后编辑:Cœuralan.chen 更新时间:4/15/2021 访问量:119356
赋值运算符和复制构造函数有什么区别?
What's the difference between assignment operator and copy constructor?
问:
我不明白C++中的赋值构造函数和复制构造函数之间的区别。它是这样的:
class A {
public:
A() {
cout << "A::A()" << endl;
}
};
// The copy constructor
A a = b;
// The assignment constructor
A c;
c = a;
// Is it right?
我想知道如何分配赋值构造函数和复制构造函数的内存?
答:
第一个是副本初始化,第二个只是赋值。没有赋值构造函数这样的东西。
A aa=bb;
使用编译器生成的复制构造函数。
A cc;
cc=aa;
使用默认构造函数构造 ,然后在已存在的对象上使用 *赋值运算符** ()。cc
operator =
我想知道如何分配赋值构造函数和复制构造函数的内存吗?
在这种情况下,IDK您所说的分配内存是什么意思,但如果您想查看会发生什么,您可以:
class A
{
public :
A(){ cout<<"default constructor"<<endl;};
A(const A& other){ cout<<"copy constructor"<<endl;};
A& operator = (const A& other){cout <<"assignment operator"<<endl;}
};
我还建议你看看:
复制构造函数用于从其他对象的数据初始化以前未初始化的对象。
A(const A& rhs) : data_(rhs.data_) {}
例如:
A aa;
A a = aa; //copy constructor
赋值运算符用于将先前初始化的对象的数据替换为其他对象的数据。
A& operator=(const A& rhs) {data_ = rhs.data_; return *this;}
例如:
A aa;
A a;
a = aa; // assignment operator
您可以用默认的构造加赋值来替换复制构造,但这样做会降低效率。
(顺便说一句:我上面的实现正是编译器免费授予你的实现,所以手动实现它们没有多大意义。如果您拥有这两个资源之一,则可能是手动管理某些资源。在这种情况下,根据三法则,您很可能还需要另一个加上析构函数。
评论
=default;
= default
复制构造函数和赋值运算符之间的区别给新程序员带来了很多困惑,但这实际上并没有那么困难。总结:
- 如果在复制之前必须创建新对象,则使用复制构造函数。
- 如果在复制之前不必创建新对象,则使用赋值运算符。
赋值运算符示例:
Base obj1(5); //calls Base class constructor
Base obj2; //calls Base class default constructor
obj2 = obj1; //calls assignment operator
复制构造函数示例:
Base obj1(5);
Base obj2 = obj1; //calls copy constructor
评论
v2
是先前声明并包含元素 vector<A>
)调用我的显式复制构造函数而不是?我期望调用 operator=
而不是复制构造函数
,因为我的 v3
对象在我执行赋值时已经声明vector <A> v3
v3 = v2
A
operator=
格里戈里·赛义德(Grigore Said@Luchian是这样实现的
class A
{
public :
int a;
A(){ cout<<"default constructor"<<endl;};
A(const A& other){ cout<<"copy constructor"<<endl;};
A& operator = (const A& other){cout <<"assignment operator"<<endl;}
};
void main()
{
A sampleObj; //Calls default constructor
sampleObj.a = 10;
A copyConsObj = sampleObj; //Initializing calls copy constructor
A assignOpObj; //Calls default constrcutor
assignOpObj = sampleObj; //Object Created before so it calls assignment operator
}
输出
Default 构造函数
Copy 构造函数
Default 构造函数
赋值运算符
复制构造函数和赋值构造函数之间的区别在于:
- 如果是复制构造函数,它会创建一个新对象。(
<classname> <o1>=<o2>
) - 如果是赋值构造函数,它不会创建任何对象,这意味着它适用于已经创建的对象()。
<o1>=<o2>
两者的基本功能是相同的,它们会逐个成员地将数据从 o2 复制到 o1。
关于复制构造函数要添加的一些东西:
按值传递对象时,它将使用复制构造函数
当一个对象按值从函数返回时,它将使用复制构造函数
使用另一个对象的值初始化一个对象时(如您给出的示例)。
简单来说,
当从现有对象创建新对象时,将调用复制构造函数,作为现有对象的副本。 当从另一个现有对象为已初始化的对象分配新值时,将调用赋值运算符。
例-
t2 = t1; // calls assignment operator, same as "t2.operator=(t1);"
Test t3 = t1; // calls copy constructor, same as "Test t3(t1);"
我想就这个话题再补充一点。 “赋值运算符的运算符函数只能写为类的成员函数。”我们不能像其他二进制或一元运算符那样将其作为友元函数。
评论