c++:当使用结果作为成员函数的形参时,关于转换构造函数的混淆
C++:confusion about converting constructor when using the result as parameter of a member function
问题基于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& rhs
或Sales_data&& rhs
- 如何定义依赖于参数包转换的函数的返回类型
- 独立于实现的浮点/整数转换
- 将函数应用于元组中的每个元素,将每个元素强制转换为类型包中的不同类型,然后作为参数包传递
- DirectX矩阵:相对于面向方向的转换(例如在FPS中)
- 将 lua 脚本转换为等效于它的指令(操作码)
- 将 c 样式强制转换转换为正确的 c++ 转换
- C# 是否有办法将双精度数组强制转换为类似于C++转换为 char* 的字符串?
- 动态强制转换适用于模板成员函数内的共享指针和弱指针,无需代码重复
- 我需要转换一些代码,以便它适用于输入和输出文件文本
- C++ 自动"类型转换"转换
- 可疑的指针转换转换(区域太小)
- 如何强制转换优先于其他转换
- 以具有多个点(版本号)的格式将数字强制转换(转换)为字符串
- size_t C++转换/转换为字符串
- 将复杂的C++转换转换为 C#
- 如何在 vim 中将 C 样式转换转换为C++样式转换
- 如何编写类型特征来检查一个类型是否可以通过非窄化转换转换为另一个类型
- 处理模棱两可的类型转换/转换的正确方法是什么?
- c++隐式转换:转换顺序
- 多态数据转换/转换设计模式