C++ 什么';复制构造函数和=运算符之间的差异

C++ 什么';复制构造函数和=运算符之间的差异,c++,C++,我写了一个简单的代码,我的问题是:为什么item_base只调用construct函数?item_base应该调用“copy construct function”吗?我观察到当我创建item_base 2时,它调用“copy construct function”,但item_base不调用“copy construct function”。有什么区别 class Item_base { public: Item_base(); Item_base(in

我写了一个简单的代码,我的问题是:为什么item_base只调用construct函数?item_base应该调用“copy construct function”吗?我观察到当我创建item_base 2时,它调用“copy construct function”,但item_base不调用“copy construct function”。有什么区别

class Item_base {
    public:
        Item_base();
        Item_base(int);
        Item_base(const Item_base &base);
        void operator=(const Item_base &item);
        virtual ~Item_base();
};

Item_base::Item_base()
{
    cout << "construct function" << endl;
}

Item_base::Item_base(int a)
{
    cout << "arg construct function" << endl;
}
Item_base::Item_base(const Item_base &base)
{
    cout << "copy function" << endl;
}

void Item_base::operator=(const Item_base &item)
{
    cout << "= operator" << endl;
}

Item_base::~Item_base()
{
}


int main()
{
    //cout << "Hello world!" << endl;
    Item_base item_base = Item_base(1);//construct function
    Item_base item_base2 = item_base;//copy construct  function
    Item_base item_base3;
    item_base3 = item_base2;// =operator function
    return 0;
}
class项目库{
公众:
Item_base();
项目基础(内部);
项目基础(施工项目基础和基础);
void运算符=(常量项\基本项和项);
虚拟~Item_base();
};
Item_base::Item_base()
{

coutitem\u base不使用复制构造函数,因为对象已构建。
您只是分配
项库3
,而不是重新创建它。

项库不使用复制构造函数,因为对象已构建。 你只是分配了<代码> ItEnthBase3/Cuth>,你不重新创建它。< /P> < P> >它称为“复制删除”或“复制构造函数删除”。C++标准允许实现省略某些副本。临时对象<代码> ItMyBASE(1)< /C> >变量>代码> ItMasBase< /Cord>是一个这样的副本。 这同样适用于C++11中的移动

因此,当您定义
item_base
时,在您的实现中,它只是使用参数
1
构造的,而不是构造然后复制的临时文件。所有有价值的编译器都实现了复制省略,尽管如果您使用编译器选项禁用它,您会看到这里调用了两个构造函数

定义
项目库2
时,必须复制
项目库
,因为没有其他方法可以初始化
项目库2

定义
item_base3
时,它的构造不带任何参数

当你分配给<代码> ItMyBase3/COD>它已经存在,当然没有构造。赋值运算符被调用。

< P>它称为“复制删除”或“复制构造器删除”。C++标准允许实现省略某些副本。临时对象<代码> ItMyBASE(1)的副本。
到变量
项库
就是这样一个副本

这同样适用于C++11中的移动

因此,当您定义
item_base
时,在您的实现中,它只是使用参数
1
构造的,而不是构造然后复制的临时文件。所有有价值的编译器都实现了复制省略,尽管如果您使用编译器选项禁用它,您会看到这里调用了两个构造函数

定义
项目库2
时,必须复制
项目库
,因为没有其他方法可以初始化
项目库2

定义
item_base3
时,它的构造不带任何参数


当您分配给
item_base3
时,它已经存在,因此当然没有构造。调用赋值运算符。

当您将一个已构造的对象复制到另一个正在创建的对象时,将调用复制构造函数。该调用是隐式的

Item_base z;
Item_base x = z; //Copying `z` into `x`
赋值运算符用于显式赋值。不一定在构造时使用

Item_base y;
y = x;

当您将一个已构造的对象复制到另一个正在创建的新对象时,将调用一个复制构造函数。该调用是隐式的

Item_base z;
Item_base x = z; //Copying `z` into `x`
赋值运算符用于显式赋值。不一定在构造时使用

Item_base y;
y = x;

为了完全清楚,这两个函数都调用了copy构造函数

Item_base a2 = a1;

Item_base a2(a1);

两个都不调用赋值运算符。

要完全清楚,两个都调用复制构造函数

Item_base a2 = a1;

Item_base a2(a1);

也不调用赋值运算符。

复制构造函数通过使用现有对象创建新对象,而赋值运算符在两个现有对象之间工作,即只将一个对象的值赋值给另一个对象

Ex:(复制构造函数)

例:(赋值运算符)


复制构造函数通过使用现有对象创建新对象,而赋值操作符在两个现有对象之间工作,即只将一个对象的值赋值给另一个对象

Ex:(复制构造函数)

例:(赋值运算符)


可能的复制实际上,这是一个更好的复制:我相信在第一种情况下,
Item\u base(1)
的构造函数被调用,然后编译器只是优化了这里临时对象的复制。可能的复制实际上,这是一个更好的复制:我相信在第一种情况下,
Item\u base(1)的构造函数
被调用,然后编译器只优化此处临时对象的复制。