友元函數:
類的友元函數是定義在類外部,但有權通路類的所有私有(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;
}