c++:当使用结果作为成员函数的形参时,关于转换构造函数的混淆

C++:confusion about converting constructor when using the result as parameter of a member function

本文关键字:于转换 转换 构造函数 形参 结果 函数 成员 c++      更新时间:2023-10-16

问题基于c++ primer 5th edition7.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{又称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

基本上,临时对象在创建它的完整表达式的末尾被销毁,但是在绑定到引用之后,当引用超出作用域时,临时对象将被销毁。

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

从这段代码:Sales_data& combine(Sales_data);将创建一个新的临时Sales_data,它将复制已传递的Sales_data参数的值,因此它很好。该临时函数将在函数结束时过期。

Sales_data& combine(Sales_data&);这段代码占用一个现有的Sales_data并引用它。它不能接受右值(没有变量标识符的值)。

为了让它接受rvalue,它必须声明为const Sales_data& rhsSales_data&& rhs