问题基于C++入门第5版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;
}
代码执行得很好,但是如果我更改成员函数的声明:combine,则会发生歧义。
Sales_data& combine(Sales_data&);
编译错误:未知参数1从“std::string {aka std::basic_string}”到“Sales_data&”的转换
Sales_data& combine(Sales_data);
编译时未报告任何错误。
我知道字符串对象s可以转换为Sales_data对象,例如:
Sales_data temp(s);
item1.combine(temp);
但是我对成员函数:combine中所需的参数类型感到非常困惑。希望对您有所帮助!
最佳答案
对于item1.combine(s);
,将创建Sales_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
基本上,临时对象会在创建该对象的完整表达式的末尾被破坏,但是绑定(bind)到引用之后,当引用超出范围时,该临时对象将被破坏。
对于您的情况,
rhs
是仅输入参数,因此不需要使用非const引用,并且与按值传递相比,按const引用传递可以避免不必要的复制,因此Sales_data& combine(const Sales_data&);
是最好的。关于c++ - C++:关于将结果用作成员函数的参数时转换构造函数的困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31444343/