我们平时输出类对象中的数据,需要调用内部专门的函数然后再进行数据的输出。
比如: cout << 对象.getAge << endl; cout << 对象.description() << endl;
那么为了输出方便,我们可以使用输出运算符重载,这样就可以直接对对象进行输出。cout << 对象 << endl;
输出运算符重载可以使用成员函数也可以使用全局函数,但是建议使用全局函数实现输出运算符的重载
class Human {
public:
Human(int age, int salary, const char* name);
friend ostream& operator<<(ostream& os, const Human& man);
private:
int age;
int salary;
string name;
};
int main(void) {
Human man1(18, 15000, "ABC");
// ostream& operator(cout,man1);
cout << man1 << endl;
system("pause");
return 0;
}
Human::Human(int age, int salary, const char* name)
{
this->name = name;
this->salary = salary;
this->age = age;
}
ostream& operator<<(ostream& os, const Human& man) {
os << "姓名: " << man.name << " 年龄:" << man.age << " 薪水:" << man.salary << endl;
return os;
}
1. ostream& opoerator<<(ostream & os, const Human& human); 是输出重载函数的原型。
2. ostream在之前提到过,是输出流对象,cout其实是ostream的一个特殊对象。 我们这里返回ostream的引用,是为了可以连续输出, cout << man << endl; (cout << man调用函数后,返回输出流对象,这样又可以输出endl了)
3. cout << man, 其实是在调用输出重载函数,输出流对象和输出的对象作为函数的参数(参数的顺序和语句的书写顺序是一样的,所以参数中,输出流应该写在左侧)
4. 因为使用全局函数实现输出重载函数,所以可以将其设置为友元。
class Human {
public:
Human(int age, int salary, const char* name);
ostream& operator<<(ostream& os);
private:
int age;
int salary;
string name;
};
int main(void) {
Human man1(18, 15000, "ABC");
// cout << man1; 函数调用cout.operator<<(man1)
man1 << cout; // 函数调用man1.operator<<(cout)
system("pause");
return 0;
}
Human::Human(int age, int salary, const char* name)
{
this->name = name;
this->salary = salary;
this->age = age;
}
ostream& Human::operator<<(ostream& os)
{
os << "姓名: " << name << " 年龄:" << age << " 薪水:" << salary << endl;
return os;
}
1. 首先我们使用成员函数实现输出运算符重载,只需要传入输出流对象就行,因为编译器会自己传入一个对象的参数。(也就是this指针)
2. 我们在输出的过程中其实就是调用函数的过程,cout << man1; 就是 cout.operator<<(man1);但是成员函数Human& operator<<(ostream& os);使我们在Human类中定义的,cout中是没有的。所以不正确。
要想调用得写成 man1 << cout; 调用man1.operator<<(cout); Human类中的输出运算符重载函数,想要正常输出就得这么写,这和我们一般的写法违背,所以不建议使用成员函数重载输出运算符。
其实输入运算符和输出运算符是完全类似的,为了直接给对象进行赋值,实现方法也类似。(只不过cin是输入流istream的特殊对象)。