我不明白 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(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
您可以通过默认构造加赋值来替换复制构造,但这会降低效率。
(附带说明:我上面的实现正是编译器免费授予您的实现,因此手动实现它们没有多大意义。如果您拥有这两者之一,则很可能您正在手动管理某些资源。在这种情况下,根据三法则,你很可能还需要另一个加上一个析构函数。)
复制构造函数和赋值运算符之间的区别给新手程序员带来了很多困惑,但实际上并没有那么困难。总结:
赋值运算符示例:
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
第一个是复制初始化,第二个只是赋值。没有赋值构造函数之类的东西。
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;}
};
我还建议你看看:
简单来说,
当从现有对象创建新对象时调用复制构造函数,作为现有对象的副本。当已经初始化的对象从另一个现有对象分配新值时,将调用赋值运算符。
例子-
t2 = t1; // calls assignment operator, same as "t2.operator=(t1);"
Test t3 = t1; // calls copy constructor, same as "Test t3(t1);"
@Luchian Grigore 说的是这样实现的
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
}
输出
默认构造函数
复制构造函数
默认构造函数
赋值运算符
复制构造函数和赋值构造函数的区别是:
<classname> <o1>=<o2>
)<o1>=<o2>
)。两者的基本功能相同,它们将数据从 o2 逐个成员复制到 o1 成员。
我想就这个话题再补充一点。“赋值运算符的运算符函数只能写为类的成员函数。” 与其他二元或一元运算符不同,我们不能将其作为友元函数。
关于复制构造函数的补充:
当按值传递对象时,它将使用复制构造函数
当一个对象按值从函数中返回时,它将使用复制构造函数
使用另一个对象的值初始化对象时(如您给出的示例)。