赋值运算符和复制构造函数之间有什么区别?

ala*_*hen 95 c++ memory

我不明白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?
Run Code Online (Sandbox Code Playgroud)

我想知道如何分配赋值构造函数和复制构造函数的内存?

sbi*_*sbi 138

一个拷贝构造函数用于初始化一个先前未初始化从其他对象的数据对象.

A(const A& rhs) : data_(rhs.data_) {}
Run Code Online (Sandbox Code Playgroud)

一个赋值运算符是用来替换的数据之前初始化一些其他对象的数据对象.

A aa;
A a = aa;  //copy constructor
Run Code Online (Sandbox Code Playgroud)

您可以使用默认构造和赋值替换复制构造,但效率会降低.

(作为旁注:我上面的实现正是编译器免费授予你的那些实现,因此手动实现它们没有多大意义.如果你有这两个中的一个,那么很可能是你手动管理一些资源.在这种情况下,根据The Rule of Three,你很可能还需要另一个加上析构函数.)

  • 请注意:现在(C++ 11以后),它们可以使用`= default;`显式默认. (4认同)
  • @Deduplicator同样重要的是要提到,当坚持需要琐碎的构造函数的分类时,你必须**`= default`它们需要默认的ctor:简单地自己实现一个空体仍然算作用户定义因此(在Standardese级别上)并不是微不足道的,并且从需要琐碎的ctor的分类中取消这种类型的资格. (2认同)

Aru*_*run 38

复制构造函数和赋值运算符之间的区别会给新程序员带来很多混乱,但实际上并不是那么困难.总结:

  • 如果必须在复制之前创建新对象,则使用复制构造函数.
  • 如果在复制发生之前不必创建新对象,则使用赋值运算符.

赋值运算符的示例:

Base obj1(5); //calls Base class constructor
Base obj2; //calls Base class default constructor
obj2 = obj1; //calls assignment operator
Run Code Online (Sandbox Code Playgroud)

复制构造函数的示例:

Base obj1(5);
Base obj2 = obj1; //calls copy constructor
Run Code Online (Sandbox Code Playgroud)


Luc*_*ore 18

第一个是复制初始化,第二个是赋值.没有赋值构造函数这样的东西.

A aa=bb;
Run Code Online (Sandbox Code Playgroud)

使用编译器生成的复制构造函数.

A cc;
cc=aa;
Run Code Online (Sandbox Code Playgroud)

使用默认构造函数构造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;}
};
Run Code Online (Sandbox Code Playgroud)

我还建议你看看:

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

什么是三法则?


Sat*_*ish 7

简单来说,

当从现有对象创建新对象时调用复制构造函数,作为现有对象的副本。当一个已经初始化的对象从另一个现有对象分配一个新值时,将调用赋值运算符。

例子-

t2 = t1;  // calls assignment operator, same as "t2.operator=(t1);"
Test t3 = t1;  // calls copy constructor, same as "Test t3(t1);"
Run Code Online (Sandbox Code Playgroud)


小智 6

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

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

两者的基本功能是相同的,它们都会将数据从o2逐个成员复制到o1。