C++;:将结果用作成员函数的参数时转换构造函数的混淆 这个问题是基于C++入门第五版7.49的。 我有一个类并定义了它的转换构造函数: #include<iostream> #include<vector> using namespace std; class Sales_data{ public: Sales_data(const string&s):bookNo(s) {} //other constructor………… Sales_data& combine(const Sales_data&); private: string bookNo; unsigned units_sold = 0; double revenue = 0.0; }; Sales_data& Sales_data::combine(const Sales_data &rhs) { units_sold+=rhs.units_sold; revenue+=rhs.revenue; return *this; } int main() { string s("No.1"); Sales_data item1("No.1"); item1.combine(s); return 0; }

C++;:将结果用作成员函数的参数时转换构造函数的混淆 这个问题是基于C++入门第五版7.49的。 我有一个类并定义了它的转换构造函数: #include<iostream> #include<vector> using namespace std; class Sales_data{ public: Sales_data(const string&s):bookNo(s) {} //other constructor………… Sales_data& combine(const Sales_data&); private: string bookNo; unsigned units_sold = 0; double revenue = 0.0; }; Sales_data& Sales_data::combine(const Sales_data &rhs) { units_sold+=rhs.units_sold; revenue+=rhs.revenue; return *this; } int main() { string s("No.1"); Sales_data item1("No.1"); item1.combine(s); return 0; },c++,c++11,C++,C++11,编译错误:参数1没有从'std::string{aka std::basic_string}'到'Sales_data&'的已知转换 Sales_data& combine(Sales_data); 编译时未报告任何错误。 我知道字符串对象s可以转换为Sales_数据对象,如: Sales_data temp(s); item1.combine(temp); 但我对成员函数中所需的参数类型非常困惑:combine。希望你的帮助 用于项目1.联合收割机,将创建一个类

编译错误:参数1没有从'std::string{aka std::basic_string}'到'Sales_data&'的已知转换

    Sales_data& combine(Sales_data);
编译时未报告任何错误。 我知道字符串对象s可以转换为Sales_数据对象,如:

   Sales_data temp(s);
   item1.combine(temp);
但我对成员函数中所需的参数类型非常困惑:combine。希望你的帮助

用于
项目1.联合收割机
,将创建一个类型为
Sales\u data
的临时变量作为参数,因此

Sales_data& combine(const Sales_data&); // ok, a temporary can be used as an initializer for a const reference
Sales_data& combine(Sales_data&); // error, a temporary can't be used as an initializer for a non-const reference
Sales_data& combine(Sales_data); // ok, the temporary variable will be copied
基本上,临时对象在创建它的完整表达式的末尾被销毁,但是在绑定到引用之后,当引用超出范围时,临时对象将被销毁


对于您的情况,
rhs
是一个仅输入的参数,因此无需使用非常量引用,并且与传递值相比,传递常量引用可以避免不必要的复制,因此
Sales_data&合并(const Sales_data&)在这里是最好的。

来自此代码:
销售数据和组合(销售数据)将创建一个新的临时
Sales_数据
,它将复制已传递的
Sales_数据
参数的值,这样就可以了。函数结束后,临时文件将过期

Sales_data&合并(Sales_data&)此代码占用现有的
销售数据
并引用它。它不能接受右值(没有变量标识符的值)


为了让它接受
右值
必须声明为
const Sales\u data&rhs
Sales\u data&rhs

当您将
字符串
传递给
combine()
时,将创建一个临时
Sales\u data
对象。临时引用无法绑定到非常量引用-因此出现错误。您的代码已经正确,无需更改它!我现在明白了。谢谢你的帮助!
Sales_data& combine(const Sales_data&); // ok, a temporary can be used as an initializer for a const reference
Sales_data& combine(Sales_data&); // error, a temporary can't be used as an initializer for a non-const reference
Sales_data& combine(Sales_data); // ok, the temporary variable will be copied