1. 程式人生 > >C++函式過載在MFC中的體現

C++函式過載在MFC中的體現

      這個系列用幾篇簡單的博文回顧,通過MFC來挖掘C++的各種程式設計思想。進而進一步體驗C++各種關鍵語法是怎麼靈活運用的。開篇從最簡單的函式過載啟程吧!

目的:

為了減輕程式設計師記憶函式名稱的負擔,增強程式碼的可讀性,C++編譯器允許在相同作用域(全域性或某類)內定義兩個以上的同名函式

重要說明:

過載函式是以引數型別或者引數個數加以區別的。每個過載函式可以有不同的返回值型別,不過函式的返回值對區別過載函式沒有意義。

典型應用:

在類的內部,使用最頻繁的過載函式是類的建構函式。因為類的建構函式一方面僅有一個名稱(即類名),另一方面又要求以多種形式構造,以便於以不同的成員變數以不同的方式進行初始化。這樣,為了給類的使用者以多種選擇,就必然進行建構函式的過載。

class CFile : public CObject
{
public:
.............

// Constructors
    CFile();//建立一個file物件不關聯任何檔案,以後呼叫CFile::Open()開啟指定檔案
    CFile(HANDLE hFile);//構造物件時,關聯一個檔案控制代碼。該控制代碼可以是API OpenFile()返回的
    CFile(LPCTSTR lpszFileName, UINT nOpenFlags);//構造物件時,以nOpenFlags指定方式,開啟lpszFileName指定的檔案

.........
};
class CPen : public CGdiObject
{
public:
// Constructors
	CPen();//先構造CPen物件,然後呼叫CreatePen初始化
	CPen(int nPenStyle, int nWidth, COLORREF crColor);////使用指定的樣式、寬度和畫筆屬性建立一個CPen物件
	CPen(int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush,int nStyleCount = 0, const DWORD* lpStyle = NULL);
	BOOL CreatePen(int nPenStyle, int nWidth, COLORREF crColor);//使用指定的樣式、寬度和顏色建立一個畫筆,並附加到已經存在的物件。
	BOOL CreatePen(int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush,int nStyleCount = 0, const DWORD* lpStyle = NULL);
	BOOL CreatePenIndirect(LPLOGPEN lpLogPen);//在給定的樣式、寬度和顏色建立一個畫筆在 LOGPEN 結構,並將它附加到 CPen 物件。
.......................
};



有關過載函式問題,還有不少用在類的其它函式中,例如CDC的SelectObject(),這個可能是MFC類庫中過載版本最多的一個。

class CDC : public CObject
{
.......
public:
	virtual CGdiObject* SelectStockObject(int nIndex);
	CPen* SelectObject(CPen* pPen);
	CBrush* SelectObject(CBrush* pBrush);
	virtual CFont* SelectObject(CFont* pFont);
	CBitmap* SelectObject(CBitmap* pBitmap);
	int SelectObject(CRgn* pRgn);       // special return for regions
	CGdiObject* SelectObject(CGdiObject* pObject);
.......
}


至此函式過載已經講完了,不知道讀者還有什麼需要補充進來的,歡迎大家補充!

可能細心的讀者還有疑問,是否可以過載已經存在的函式,例如printf,MessageBox,fprintf,strcpy等等,這個是完全沒有問題的,不行可以試試,都可以按照自己的寫法來過載C++標準函式庫的這些函式。

 想知道後面會發生什麼樣的事情和解決方案,請看下一篇: