友元函数和重载

友元函数:

类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。

友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。

如果要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字 friend

重载函数步骤:(以重载-作为例子)

1.operator-

2.看函数左右两边的操作数类型operator-(Complex &c1, Complex &c2);

3.返回类型Complex operator-(Complex &c1, Complex &c2);

4.全局函数重载注意友元函数声明。


友元函数真正应用场景是在重载中,当用全局函数重载的时候,需要访问类的私有变量,此时友元函数的作用就体现了,废话不多说例子如下:

class Complex
{
friend ostream & operator<<(ostream &out, Complex& c);
friend Complex operator-(Complex &c1, Complex &c2);
private:
int a; 
int b;
public :
Complex(int a,int b)
{
this->a = a;
this->b = b;
}
Complex operator+(Complex &c1);
void printC()
{
cout << a << "+" << b << "i" << endl;
}
};

Complex operator-(Complex &c1, Complex &c2)//这是全局变量无法访问Complex类的私有变量a和b,但是重载类减号,必须得

//访问累的私有变量,所以用友元函数可以轻松解决这一问题。另外也可以使用类成员函数的方法进行重载。方法如重载+

{
Complex c3(c1.a - c2.a, c1.b - c2.b);
return c3;

}

Complex Complex::operator+(Complex &c1)//类成员函数重载
{
Complex c2(this->a + c1.a, this->b + c1.b);
return c2;

}

//另外特别需要注意的就是对<<的重载,因为<<的左操作数是ostream 对象,无法在该类中进行成员函数重载,所以只能进行

//全局函数重载,所以这个时候友元函数就必不可少。所以说友元函数真正的应用场景是在重载中

ostream & operator<<(ostream &out, Complex& c)
{
out << c.a << " + " << c.b << "i" << endl;
return out;
}

猜你喜欢

转载自blog.csdn.net/qianyayun19921028/article/details/80996488
今日推荐