这个系列用几篇简单的博文回顾,通过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++标准函数库的这些函数。
想知道后面会发生什么样的事情和解决方案,请看下一篇: