电子说
>>> 背景
我们知道对于一些C++内建类型来说,ostream类的操作符<<都提供了输出到标准输出流的方法,只需要像下面这样就能输出到终端窗口了。
int num = 1;
string str = "number";
cout < < str < < " is " < < num;
但是对于自建类的话,就需要其他的手段输出想要的内容了。通过重载<<操作符并声明为ostream类的友元是常见的方法。下面就是一种常见的书写范式。
class Persion
{
private:
string name;
int age;
public:
Persion() = delete;
Persion(string a_name, int a_age) :
name(a_name), age(a_age) {}
friend ostream& operator< < (ostream& os, Persion& per)
{
os < < "(lvalue)A persion object with name: " < < per.name < < ", age: " < < per.age;
return os;
}
};
>>> 问题
我在使用下面这串代码对重载的效果进行测试的时候,编译器报出了问题,它告诉把右值赋给了要求左值引用的参数。
cout < < Persion("maxwell", 18) < < endl;
>>> 解决方案
C++11之后,使用&来声明左值引用,使用&&来声明右值引用。在上述测试语句中,Persion( "maxwell" , 18 )是一个临时变量,属于右值。因此,如果想要上述测试语句通过,还需要对类补充一个右值引用的成员函数。如下所示。
class Persion
{
// ...
friend ostream& operator< < (ostream& os, Persion&& per)
{
os < < "(rvalue)A persion object with name: " < < per.name < < ", age: " < < per.age;
return os;
}
};
全部0条评论
快来发表一下你的评论吧 !