问题基于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/

10-11 22:33
查看更多