做为一个类,他最基础的成员函数就要数构造函数了。这里咱们先探讨一下构造函数为何不能是虚函数。html
在解决这个问题以前,要先明白类中函数的调用方式。一个类的函数共用一个函数空间,所以在实例化的对象中是不占空间的。每当有函数调用的时候,会有一个指向该函数空间的指针,依次开始寻找被调用函数。须要注意的是,虚函数的函数空间与普通的函数不一样,由于须要类的对象将虚函数实例化,所以不一样对象的虚函数实例化后不必定相同,因此虚函数的函数空间实际上在对象中。web
知道了以上几点就能够明白,若是构造函数是虚函数,就会存在一个矛盾。类须要用构造函数生成对象,而构造函数在对象的虚函数空间中,但此时还不存在对象,不存在虚函数指针,没法调用构造函数。所以构造函数不能做为虚函数。app
----------------------------------------------------------------------函数
接下来对函数重载进行总结this
参考:http://www.cnblogs.com/xyl-share-happy/archive/2012/12/06/2804401.htmlspa
咱们学过运算符重载(说实话这一块我没学好,看了下书可是什么都没记住QAQ),有三种方式:普通函数,友元函数,类成员函数指针
运算符重载是为了对用户自定义数据类型的数据的操做与内定义的数据类型的数据的操做形式一致。orm
不能重载的5个运算符:*成员指针访问运算符;::域运算符;sizeof长度运算符;?:条件运算符;.成员访问符htm
双目运算符重载为成员函数时,仅有一个参数。对象
单目运算符重载为成员函数时,不能再显式说明参数,老是隐含了一个参数,该参数是this指针。this指针是指向调用该成员函数对象的指针。
运算符重载函数还能够为友元函数。
当重载友元函数时,将没有隐含的参数this指针。这样,对双目运算符,友元函数有2个参数,对单目运算符,友元函数有一个参数。
可是存在一些运算符不能被重载为友元函数:=,(),[ ],- >。
赋值运算符“=”只能重载为非静态成员函数。
不能重载为静态成员函数是由于静态成员函数是属于整个类的,不是属于某个对象的,静态成员函数只能操做静态数据成员。而赋值运算符“=”是来操做对象的。
若是把赋值运算符“=”重载为友元函数,会使程序出现两种矛盾:
(1)程序认为类中不存在重载赋值运算符“=”的成员函数,因而程序调用相应的构造函数;
(2)在全局中咱们已经将赋值运算符“=”重载为友元函数,而赋值语句与此函数匹配,因而程序调用这条友元函数。
为了不矛盾的产生,赋值运算符“=”不容许重载为友元函数。
另一个特例是流运算符,不能重载为成员函数,只能重载为友元函数。
若是要用成员函数,则会有cout.operator<<(const F& f),因此这是不可能的.所以只能用友员来实现,operator<<(cout,f) 而cout是ostream型的,所以有如下标准格式.注意不能加const,由于cout是要改变的,会改变里的缓冲成员.
friend ostream& operator<<( ostream& cout, constF&) //输出运算符的标准重载格式.
friend istream& operator>>(istream& is, F& f){ } //输入运算符重载标准格式
单目运算符重载
-友元函数形式:返回类型 operatorX(形参)
使用:X obj ---> operatorX(obj);
-成员函数形式 尽可能用成员:返回类型 operatorX(/*无形参*/)
使用: X obj ---> obj.operator();
注意:
在类成员函数中重载运算符是不容许返回引用的,会出现“返回局部变量的地址”警告;
把后++,后--看成双目运算符,第二个操做数是整形;
强制类型转换:类型(数据) --> (没必要写返回类型,由于始终与后面的类 型是相同的) operator类型(无形参) 只能写成成员函数,不能是友员.
单目运算符重载
-友元函数形式:返回类型 operatorX(形参)
使用:X obj ---> operatorX(obj);
-成员函数形式 尽可能用成员:返回类型 operatorX(/*无形参*/)
使用: X obj ---> obj.operator();