c++运算符重载(3)-- 输入输出运算符的重载

我们平时输出类对象中的数据,需要调用内部专门的函数然后再进行数据的输出。

比如:  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的特殊对象)。 

你可能感兴趣的:(c++,开发语言)