什么';赋值运算符和复制构造函数之间的区别是什么? 我不明白C++中赋值构造函数和复制构造函数的区别。是这样的: A类{ 公众: (){ cout

什么';赋值运算符和复制构造函数之间的区别是什么? 我不明白C++中赋值构造函数和复制构造函数的区别。是这样的: A类{ 公众: (){ cout,c++,memory,C++,Memory,第一个是复制初始化,第二个只是赋值。没有赋值构造函数这样的东西 A aa=bb; A cc; cc=aa; 使用编译器生成的复制构造函数 A aa=bb; A cc; cc=aa; 使用默认构造函数在已存在的对象上构造cc,然后构造*assignment操作符**(操作符=) 我想知道如何分配赋值构造函数和复制构造函数的内存 IDK在本例中分配内存是什么意思,但如果您想了解发生了什么,可以: class A { public : A(){ cout<<"default

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

A aa=bb;
A cc;
cc=aa;
使用编译器生成的复制构造函数

A aa=bb;
A cc;
cc=aa;
使用默认构造函数在已存在的对象上构造
cc
,然后构造*assignment操作符**(
操作符=

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

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类
{
公众:
({coutA复制构造函数用于从其他对象的数据初始化以前未初始化的对象

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

A aa;
A a = aa;  //copy constructor
A aa;
A a;
a = aa;  // assignment operator
赋值运算符用于将先前初始化的对象的数据替换为其他对象的数据

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

A aa;
A a = aa;  //copy constructor
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
复制构造函数示例:

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

@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
}
A类
{
公众:
INTA;

A(){cout复制构造函数和赋值构造函数之间的区别是:

  • 对于复制构造函数,它将创建一个新对象。(
    =
  • 对于赋值构造函数,它不会创建任何对象,这意味着它将应用于已创建的对象(
    =

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

    关于复制构造函数的一些补充:

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

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

    • 使用另一个对象的值初始化对象时(如您给出的示例所示)

      • 简单地说

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

        范例-

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

        我想在这个话题上再补充一点。
        “赋值运算符的运算符函数应仅作为类的成员函数编写。”我们不能将其作为友元函数而与其他二元或一元运算符不同。

        可以公平地说,赋值运算符有效地将旧对象的销毁与新对象的创建结合起来,但附带以下条件:(1) 如果旧对象销毁过程中的一个步骤会被新对象构造过程中的一个步骤撤消,那么这两个步骤都可以省略;(2)如果将对象分配给自身,赋值运算符不应该做坏事。为什么要执行
        vector v3
        然后执行
        v3=v2
        (其中,
        v2
        是先前声明的并包含元素
        向量
        )调用我的显式
        A
        的复制构造函数,而不是
        操作符=
        ?我希望调用
        操作符=
        ,而不是
        复制构造函数
        ,因为我的
        v3
        对象在我执行赋值的时候已经声明了只是一个提示:现在(C++11以后),它们可以使用
        =default;
        @Deduplicator显式默认。另外,当遵循需要简单构造函数的分类时,您必须在需要默认构造函数的地方使用
        =default
        它们:只需自己实现一个空的主体仍然算作用户定义的构造函数,因此(在标准水平上)不是平凡的,并且从需要平凡的构造函数的分类中取消该类型的资格。@sbi我可以说,如果不使用复制构造函数,而是使用赋值运算符,则首先通过调用带参数或不带参数的构造函数来创建对象,然后使用赋值运算符并基于此赋值在RHS上。如果使用复制构造函数,仍将调用相同的构造函数,但用于初始化的值来自其他对象。@Rajesh:我对您的要求感到困惑,我的感觉是,这是因为您也感到困惑。
        :)
        你能再解释一下你在说什么吗?@CătălinaSîrbu:可以。它们是两个独立的函数。