C++ 关于复制构造

C++ 关于复制构造,c++,copy-constructor,default-copy-constructor,C++,Copy Constructor,Default Copy Constructor,如果我使用构造初始化并且它是正确的。但是如果使用“price(orig.price)”并且它会出错,为什么呢?这是不正确的,因为price已经构建好了。如果它已被构造,则不能调用它的复制构造函数 你必须做一些事情,比如price=orig.price 这是不正确的,因为价格已经确定。如果它已被构造,则不能调用它的复制构造函数 你必须做一些事情,比如price=orig.price 检查编译错误,您将看到原因。在成员初始值设定项列表中,price(orig.price)是具有值orig.price

如果我使用构造初始化并且它是正确的。但是如果使用“price(orig.price)”并且它会出错,为什么呢?

这是不正确的,因为price已经构建好了。如果它已被构造,则不能调用它的复制构造函数


你必须做一些事情,比如price=orig.price

这是不正确的,因为价格已经确定。如果它已被构造,则不能调用它的复制构造函数


你必须做一些事情,比如price=orig.price

检查编译错误,您将看到原因。在成员初始值设定项列表中,
price(orig.price)
是具有值
orig.price
的成员变量
price
。在复制构造函数的主体中,
price(orig.price)
是对
std::string
中重载的
操作符()的调用,该操作符接受
std::string
。由于没有此类重载,因此会出现编译错误。

检查编译错误,您将了解原因。在成员初始值设定项列表中,
price(orig.price)
是具有值
orig.price
的成员变量
price
。在复制构造函数的主体中,
price(orig.price)
是对
std::string
中重载的
操作符()的调用,该操作符接受
std::string
。由于没有此类重载,因此会出现编译错误。

构造函数的函数体(左大括号和右大括号之间的部分)与任何其他函数体没有区别。您是否希望编译以下内容:

class Wood {
public:
    Wood();
    Wood(const Wood&); //copy constructor
    ~Wood();

private:
    string price;
};

Wood::Wood(const Wood& orig) {
    price(orig.price);   **//error, why?**
}

Wood::Wood(const Wood& orig) : price(orig.price) { //rigth

}
相当于这样一句话:

: price(orig.price)
但是不需要指定
price
的类型,因为这已经在类定义中完成了

请注意,您不能在构造函数体中进行成员初始化,因为当您到达那里时,所有成员都已初始化。这就是为什么需要初始化列表。当然,您可以在构造函数体中执行赋值:

std::string price(orig.price);

但这与初始化不同。它不适用于某些类型(例如常量成员、引用成员或没有默认构造函数的成员)。对于某些类型,它可能效率较低,因为您首先构造(使用默认构造函数),然后分配。但对于许多类型来说,这并不重要,因为默认构造几乎不需要任何成本。

构造函数的函数体(左大括号和右大括号之间的部分)与任何其他函数体没有什么不同。您是否希望编译以下内容:

class Wood {
public:
    Wood();
    Wood(const Wood&); //copy constructor
    ~Wood();

private:
    string price;
};

Wood::Wood(const Wood& orig) {
    price(orig.price);   **//error, why?**
}

Wood::Wood(const Wood& orig) : price(orig.price) { //rigth

}
相当于这样一句话:

: price(orig.price)
但是不需要指定
price
的类型,因为这已经在类定义中完成了

请注意,您不能在构造函数体中进行成员初始化,因为当您到达那里时,所有成员都已初始化。这就是为什么需要初始化列表。当然,您可以在构造函数体中执行赋值:

std::string price(orig.price);

但这与初始化不同。它不适用于某些类型(例如常量成员、引用成员或没有默认构造函数的成员)。对于某些类型,它可能效率较低,因为您首先构造(使用默认构造函数),然后分配。但对于许多类型来说,这并不重要,因为默认构造几乎不需要任何成本。

为什么你认为这不应该是一个错误?@AntonSavin,因为我认为使用“price(orig.price)”将使用class std::string的copy-construct函数。为什么你认为它不应该是一个错误?@AntonSavin,因为我认为“price(orig.price)”的用法将使用class std::string的copy-construct函数。谢谢,你的分析非常详细,我知道原因。谢谢,你的分析非常详细,我知道原因。