C++編程思想學習筆記---第九章 內聯函數

第九章  內聯函數


爲了解決C中不太方便,且容易出錯的宏定義的問題,C++中使用內聯函數來代替。內聯函數有三大優點:1) 增加了參數檢查,保證了代碼的正確性 2) 仍然像C中一樣,內聯函數在調用處展開,而不是像普通函數一樣需要壓棧,RETURN等返回,減少了函數調用的開銷。3)能像一般的成員函數一樣可以在類裏訪問自如。


一、預處理器的缺陷

#define F (x) (x+1)
F(1)
(x) (x+1)(1)
看上面這段代碼,程序員的本意應該是想定義一個函數F(x)實現一個將參數x加1的操作,爲了方便,他將其定義爲一個宏定義。F   (x)之間,請注意,是有空格的。這樣F(1)將被替代成(x) (x+1)(1),而不是我們預想的(1+1)。對於看似像函數的宏定義可能產生的意想不到的錯誤,稍有經驗的程序員應該早有領教。


二、宏和訪問

class X
{
    int i;
public:
    #define VAL(X::i)  //Error
};

上面這段代碼,想在類X中定義一個與類X的數據成員I有關的類似函數的宏定義。然而這是不可能的,宏定義只執行簡單的代碼替換工作,預處理器也不可能知道X與I的關係。程序設計者出於效率考慮,不得不讓一些數據成員成爲public類型,這就會暴露內部實現並妨礙在這個實現中的改變,從而消除了private提供的保護。


三、內聯函數

在C++中,宏的概念是通過內聯函數來實現的,而內聯函數無論從那一方面來說,都是真正的函數。內聯函數與普通函數唯一不同的地方是它在適當的地方像宏一樣展開,而不需要函數調用的開銷。

重要結論:任何在類中定義的函數自動成爲內聯函數,但也可以在非類的函數前面加上inline關鍵字使之成爲內聯函數。但必須在聲明和定義時同時註明inline關鍵字。如

inline int plusOne(int x);
inline int plusOne(int x)
{
    return ++x;
}

編譯器將檢查函數參數列表使用是否正確,並返回值。這些事情是預處理器無法完成的。內聯函數的聲明一般放在頭文件裏面。

請記住:使用內聯函數的目的是減少函數調用開銷。但是如果函數較大,,由於需要在調用函數的每一處重複賦值代碼,這樣將使得代碼膨脹,在速度方面獲得的好處就會減少。


1、訪問函數

在類中內聯函數的最重要的使用之一就是訪問函數(access function)。這就是一般所謂的setter和getter函數,提供類中私有數據成員的訪問。如下:

Class Access
{
	int i;
public:
	int read() const
	{
		return i;
	}
	void set(int ii)
	{
		i = ii;
	}
};

int main()
{
	Access A;
	A.set(100)'
	int x = A.read();
	
	return 0;
}

發佈了27 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章