赋值运算符和拷贝构造函数有什么区别?

我不明白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_) {} 

一个赋值运算符被用来replace一个以前被初始化的对象的数据和其他一些对象的数据。

 A& operator=(const A& rhs) {data_ = rhs.data_; return *this;} 

你可以用默认的构造和赋值来代替复制构造,但是效率会比较低。

(作为一个方面说明:我的上面的实现正是编译器免费授予你的实现,所以手动实现它们没有什么意义,如果你有这两个,那么你可能手动pipe理一些资源。在这种情况下,根据三条规则 ,你很可能还需要另一个加析构函数。)

第一个是复制初始化,第二个只是赋值。 没有分配构造函数的东西。

 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;} }; 

我也build议你看看:

为什么复制构造函数调用而不是转换构造函数?

什么是三的规则?

复制构造函数和赋值运算符之间的区别引起了新程序员的很多困惑,但实际上并不是那么困难。 总结:

  • 如果在复制之前必须创build一个新对象,则使用复制构造函数。
  • 如果在复制发生之前不需要创build新对象,则使用赋值运算符。

赋值运算符的示例:

 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 

复制构造函数和赋值构造函数的区别是:

  1. 在复制构造函数的情况下,它会创build一个新的对象( <classname> <o1>=<o2>
  2. 在赋值构造函数的情况下,它不会创build任何对象意味着它适用于已经创build的对象( <o1>=<o2> )。

而且两者的基本function都是一样的,他们会将数据从o2逐个复制到o1。

什么@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 } 

OUTPUT


默认的构造函数


复制构造函数


默认的构造函数


赋值运算符


添加一些关于拷贝构造函数的东西:

  • 当按值传递一个对象时,它将使用复制构造函数

  • 当一个对象从一个函数返回值时,它将使用复制构造函数

  • 当使用另一个对象的值初始化一个对象时(例如你给的)。

我想在这个话题上再增加一点。 “赋值运算符的运算符function只能作为类的成员函数编写”。 不能像其他二进制或一元运算符那样把它作为朋友函数。

简而言之,

复制构造函数在从现有对象创build新对象时调用,作为现有对象的副本。 当一个已经初始化的对象从另一个现有对象中被分配了一个新的值时,赋值操作符被调用。

例-

 t2 = t1; // calls assignment operator, same as "t2.operator=(t1);" Test t3 = t1; // calls copy constructor, same as "Test t3(t1);"