参考: 函数返回值是否使用引用类型的问题:理解引用、返回值_返回值类型为引用数据的作用_迂者-贺利坚的博客-CSDN博客
左移运算符可以用成员函数实现,但是效果却和实际使用的效果不同,因为利用成员函数重载 左移运算符 p.operator<<(cout), 简化版本 p << cout 与实际需要重载的cout<<p效果不一致
成员函数实现
#include<iostream>
using namespace std;
class Person
{
public:
Person() {
}
Person(int a,int b):m_A(a),m_B(b) {
}
// 利用成员函数重载 左移运算符 p.operator<<(cout), 简化版本 p << cout
//不会利用成员函数重载<<运算符,因为无法实现 cout在左侧
ostream& operator<<(ostream& cout) {
cout << this->m_A << " ";
cout << this->m_B << " ";
return cout;
}
private:
int m_A;
int m_B;
};
void test01()
{
Person p(10, 10);
//无法实现
//cout<<p;
//成员函数实现 等价于p.operator<<(cout);
p << cout;
}
int main()
{
test01();
return 0;
}
全局函数实现
#include<iostream>
using namespace std;
class Person
{
public:
Person() {
}
Person(int a, int b) :m_A(a), m_B(b) {
}
public:
int m_A;
int m_B;
};
//全局函数
ostream& operator<<(ostream& cout, Person p) { //本质 operator<<(cout,p) 简化cout<<p
cout << "m_A=" << p.m_A << "m_B= " << p.m_B << " ";
return cout;
}
void test01()
{
Person p(10, 10);
cout << "p的" << p << endl;
}
int main()
{
test01();
return 0;
}
返回值为ostream&
cout << "p的" << p << endl;为例 ,首先执行的是oprate<<(cout,"p的")实际参数——输出流对象cout(本身为引用)传递给形式参数output,在完成输出字符串"p的"的任务后,cout这个引用对象作为返回值返回到被调用处,于是余下的未执行的部分相当于:cout<<p<<endl;。这是自定义的重载函数发生作用了。
另外要注意:
如果定义的函数返回值为引用时,此函数返回的值本身也必须是引用的
比如下面定义的ostream& 返回类型 和 返回的形参cout
#include<iostream>
using namespace std;
class Person
{
public:
Person() {
}
Person(int a, int b) :m_A(a), m_B(b) {
}
public:
int m_A;
int m_B;
};
//全局函数
//无法调用,ostream&为引用,返回的cout不是引用
ostream& operator<<(ostream cout, Person p) { //cout是值返回
cout << "m_A=" << p.m_A << "m_B= " << p.m_B << " ";
return cout;
}
void test01()
{
Person p(10, 10);
cout << "p的" << p << endl;
}
int main()
{
test01();
return 0;
}
这里注意的是如果重载左移运算符函数没有返回值ostream& ,后续再加<<会发生错误
#include<iostream>
using namespace std;
class Person
{
public:
Person() {
}
Person(int a,int b):m_A(a),m_B(b) {
}
public:
int m_A;
int m_B;
};
//全局函数
//ostream& operator<<(ostream &cout,Person p) { //本质 operator<<(cout,p) 简化cout<<p
// cout << "m_A=" << p.m_A << "m_B= " << p.m_B << " ";
// return cout;
//}
//全局函数 没有返回值
void operator<<(ostream& cout, Person p) {
cout << "m_A=" << p.m_A << "m_B= " << p.m_B << " ";
}
void test01()
{
Person p(10, 10);
//等价于operator<<(cout, p);
cout << p;
//错误,没有返回值接收,无法追加输入<<
cout << p << p;
}
int main()
{
test01();
return 0;
}