目录:
应用场景:
可以输出自定义的数据类型信息
Person p("kll", "男")
cout << p << endl; // 可以输出对象p的所有属性(类似java中的toString)
左移运算符重载:
在上一篇算术运算符重载中介绍了,运算符重载可以在成员函数和全局函数中实现,但请注意:左移运算符重载务必在全局函数中实现.
class Person {
public:
string name;
string sex;
Person(string name, string sex) {
this->name = name;
this->sex = sex;
}
};
//左移运算符重载
ostream& operator<< (ostream &cout, Person &p) {
cout << "Name: " << p.name << "\n"
<< "Sex: " << p.sex << endl;
return cout;
}
void main() {
Person p("kll", "男");
// operator<<(cout, p);
// 上面代码可以简化成以下
cout << p << endl;// 此时就可以打印出该对象的信息了
}
下面来仔细看一下左移运算符重载的代码
ostream& operator<< (ostream &cout, Person &p) {
cout << "Name: " << p.name << "\n"
<< "Sex: " << p.sex << endl;
return cout;
}
当在全局函数中实现上述代码后即可直接打印出对象的信息了,下面是模板,星号中间的内容根据需求改动
ostream& operator<< (ostream &cout, *对象的引用*) {
cout << *根据你的需求打印出对象的信息* << endl;
return cout;
}
代码优化:
在实际开发过程中,对象的属性都是私有的,这时我们用实现左移运算符重载的全局函数就无法直接访问到对象私有属性,从而无法打印出对象信息,这时该怎么办呢?
1)使用set和get方法
2)可以直接把这个实现左移运算符重载的全局函数声明为类的友元
class Person {
friend ostream& operator<< (ostream& cout, Person& p);
public:
Person(string name, string sex) {
this->name = name;
this->sex = sex;
}
private:
string name;
string sex;
};
ostream& operator<< (ostream &cout, Person &p) {
cout << "Name: " << p.name << "\n"
<< "Sex: " << p.sex << endl;
return cout;
}
小结:
- 实现左移运算符重载,你可以打印对象的信息
- 左移运算符重载必须在全局函数中实现
- 记住实现左移运算符重载的模板
- 最好把实现左移运算符重载的函数声明为类的友元