C++函式過載在MFC中的體現
阿新 • • 發佈:2019-01-01
這個系列用幾篇簡單的博文回顧,通過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++標準函式庫的這些函式。
想知道後面會發生什麼樣的事情和解決方案,請看下一篇: