关于C++ 友元函数重载cin,cout,和+运算符的方法

友元函数重载"<<",">>“和”+"运算符的方法*
友元函数声明形式就是将 friend 冠于一个类中函数原型之前,则该函数成为该类的友元函数,友元函数不受声明位置private,protectd的影响。在类外对与原函数进行定义时不需要加friend(和普通函数一样)。注 友元函数不是类的成员。
举个小例子:
有两个均为3行3列的矩阵ml和m2,求两个矩阵之和。重载运算符“+”、“>>”和“<<”,使之能用于矩阵相加、输入和输出。

#include "pch.h"
#include 
using namespace std;

class Matrix    //定义一个矩阵类
{
public:
	Matrix() {};     //构造函数
	~Matrix() {};   //析构函数
	friend istream & operator >>(istream & in, Matrix &m);  //重载运算符">>"
	friend ostream & operator <<(ostream & out, Matrix &m);   //重载运算符"<<"
	friend Matrix operator +(Matrix &m1, Matrix &m2);    //重载运算符"+"

private:
	int a[3][3];   //  3*3的矩阵
};
istream & operator >>(istream & in, Matrix &m)
{
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			in >> m.a[i][j];
		}
	}
	return in;
}
ostream & operator <<(ostream & out, Matrix &m) 
{
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			out << m.a[i][j] << '\t';
		}
		cout << endl;
	}
	return out;
}

Matrix operator +(Matrix &m1, Matrix &m2)
{
	Matrix m;
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			m.a[i][j] = m1.a[i][j] + m2.a[i][j];
		}
	}
	return m;
}

void main()
{
	Matrix m, m1, m2;
	cout << "输入第一个矩阵:" << endl;
	cin >> m1;
	cout << "输入的二个矩阵:" << endl;
	cin >> m2;
	m = m1 + m2;
	cout << "两个邻矩阵的和为:" << endl;
	cout << m << endl;
}

1.friend ostream & operator <<(ostream & out, Matrix &m); 重载函数的参数表有两个参数:一个是istream流的引用,另一个是用户自定义的Point类的引用。主函数调用cin>>P;编译器解析为operator>>(cin,P);引用参数in成为cin的别名。函数返回一个对istream的引用,以便插入运算符的继续调用。
2.friend ostream & operator >>(ostream & out, Matrix &m); 中的&都是表示引用传递。返回值是按引用传递,参数也是按引用传递。cin 的返回值就是 istream 类型的引
3. 成员函数要求是有对象调用,则第一个参数必须是类的对象,但是<<和>>第一个参数是流的对象引用。故不能使用成员函数。
4. 使用友元函数,无this指针,需要两个参数,左右操作数都通过参数传递。
5. 使用成员函数左操作数由对象通过this指针传递右操作数由参数传递。
6. 双目运算符一般可以用友元函数重载和成员函数重载,但有一种情况只可以用友元函数重载。即:双目运算符左边的变量是一个常量,而不是对象!!!函数operator<<和operator>>被声明为Matrix类的友元,因为要把Matrix类对象作为运算符的右操作数,既引起调用函数的是流对象cin或cout,而不是Matrix类的对象,所以这两个的运算符重载函数必须为非成员函数。
7.不管成员函数还是友元函数重载,运算符的使用方法都相同。但由于他们的传递参数方法不同,因此导致实现代码不同,应用场合也不同。

你可能感兴趣的:(c++)