天天看點

友元函數和重載

友元函數:

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

}