目錄
友元函數
為什麼要引入友元函數:
什麼時候使用友元函數:
怎麼使用友元函數:
友元函數的分類:
代碼如下:
内聯函數:
為什麼要使用内聯函數
内斂函數定義格式
内聯函數注意事項:
代碼展示:
友元函數
有權通路類的所有私有(private)成員和保護(protected)成員。盡管友元函數的原型有在類的定義中出現過,但是友元函數并不是成員函數。友元可以是一個函數,該函數被稱為友元函數;友元也可以是一個類,該類被稱為友元類,在這種情況下,整個類及其所有成員都是友元。
如果要聲明函數為一個類的友元,需要在類定義中該函數原型前使用關鍵字 friend
為什麼要引入友元函數:
在實作類之間資料共享時,減少系統開銷,提高效率
具體來說:為了使其他類的成員函數直接通路該類的私有變量
即:允許外面的類或函數去通路類的私有變量和保護變量,進而使兩個類共享同一函數
優點:能夠提高效率,表達簡單、清晰
缺點:友元函數破環了封裝機制,盡量不使用成員函數,除非不得已的情況下才使用友元函數。
2、什麼時候使用友元函數:
1)運算符重載的某些場合需要使用友元。
2)兩個類要共享資料的時候
3、怎麼使用友元函數:
友元函數的參數:
因為友元函數沒有this指針,則參數要有三種情況:
1、 要通路非static成員時,需要對象做參數;--常用(友元函數常含有參數)
2、 要通路static成員或全局變量時,則不需要對象做參數
3、 如果做參數的對象是全局對象,則不需要對象做參數
友元函數的位置:
因為友元函數是類外的函數,是以它的聲明可以放在類的私有段或公有段且沒有差別。
友元函數的調用:
可以直接調用友元函數,不需要通過對象或指針
友元函數的分類:
根據這個函數的來源不同,可以分為三種方法:
1、普通函數友元函數:
a) 目的:使普通函數能夠通路類的友元
b) 文法:聲明位置:公有私有均可,常寫為公有
聲明: friend + 普通函數聲明
實作位置:可以在類外或類中
實作代碼:與普通函數相同(不加不用friend和類::)
調用:類似普通函數,直接調用
代碼如下:
#include <iostream>
using namespace std;
class Box
{
double width;
public:
friend void printWidth( Box box );
void setWidth( double wid );
};
// 成員函數定義
void Box::setWidth( double wid )
{
width = wid;
}
// 請注意:printWidth() 不是任何類的成員函數
void printWidth( Box box )
{
/* 因為 printWidth() 是 Box 的友元,它可以直接通路該類的任何成員 */
cout << "Width of box : " << box.width <<endl;
}
// 程式的主函數
int main( )
{
Box box;
// 使用成員函數設定寬度
box.setWidth(10.0);
// 使用友元函數輸出寬度
printWidth( box );
return 0;
}
内聯函數:
C++ 内聯函數是通常與類一起使用。如果一個函數是内聯的,那麼在編譯時,編譯器會把該函數的代碼副本放置在每個調用該函數的地方。
對内聯函數進行任何修改,都需要重新編譯函數的所有用戶端,因為編譯器需要重新更換一次所有的代碼,否則将會繼續使用舊的函數。
如果想把一個函數定義為内聯函數,則需要在函數名前面放置關鍵字 inline,在調用函數之前需要對函數進行定義。如果已定義的函數多于一行,編譯器會忽略 inline 限定符。
在類定義中的定義的函數都是内聯函數,即使沒有使用 inline 說明符。
為什麼要使用内聯函數
在c語言中,宏定義是我們保護效率的一大妙招,(宏:代碼處不加驗證的簡單替代,在編譯前将程式中有關字元串替換成宏體)如 defin pi 3.14,用3.14替換pi這個字元在程式運作前。
但是在c++中,由于私有成員不能存取,宏作用為成員函數就很無用,是以引入了内斂函數。
内斂函數定義格式
inline 傳回值類型 函數名(形式參數表)
{//函數體} //即普通函數前,加上inline即可成為内聯函數。
作用:像宏一樣展開,是以不需要花費進行參數傳遞,儲存調用狀态和傳回位址的時間。
缺點:花費大量空間
内聯函數實際上是一種空間換時間的做法。
c++類内給出函數體定義的成員函數被預設為内聯函數,類外給出函數體的成員函數不是内聯函數。
内聯函數注意事項:
代碼展示:
#include <iostream>
using namespace std;
inline int Aa(int a,int s){
return (a>s)?a:s;
}
int main()
{
cout <<Aa(2,3)<<endl;
cout <<Aa(6,3)<<endl;
cout <<Aa(72,3)<<endl;
cout <<Aa(8,3)<<endl;
return 0;
}
3
6
72
8