0

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

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

5 回答 5

5

它被称为“复制省略”或“复制构造函数省略”。C++ 标准允许实现省略某些副本。从临时对象Item_base(1)到变量item_base的副本就是这样的副本。

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

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

定义时item_base2item_base必须复制,因为没有其他方法可用于初始化item_base2

当您定义item_base3它时,它是不带参数构造的。

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

于 2013-06-26T09:30:47.597 回答
0

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

Item_base z;
Item_base x = z; //Copying `z` into `x`

赋值运算符用于显式赋值。不一定在构建时;

Item_base y;
y = x;
于 2013-06-26T09:32:14.590 回答
0

为了完全清楚,复制构造函数被调用

Item_base a2 = a1;

Item_base a2(a1);

也不需要赋值运算符。

于 2013-06-26T09:32:57.797 回答
0

item_base 不使用复制构造函数,因为对象已经被构造。你只是分配item_base3,你不重新创建它。

于 2013-06-26T09:29:42.243 回答
0

Copy Constructor 使用现有对象处理创建新对象,而Assignment 运算符在两个现有对象之间工作,即仅将一个对象的值分配给另一个对象。

例如:(复制构造函数)

Item_base ib1;
Item_base ib2 = ib1; or Item_base ib2(ib1);

例如:(赋值运算符)

Item_base ib1;
Item_base ib2
ib1=ib2;
于 2013-06-26T09:46:28.840 回答