构造函数不能为虚/重载函数总结

作为一个类,他最基础的成员函数就要数构造函数了。这里我们先探讨一下构造函数为什么不能是虚函数。

在解决这个问题之前,要先明白类中函数的调用方式。一个类的函数共用一个函数空间,因此在实例化的对象中是不占空间的。每当有函数调用的时候,会有一个指向该函数空间的指针,依次开始寻找被调用函数。需要注意的是,虚函数的函数空间与普通的函数不同,因为需要类的对象将虚函数实例化,因此不同对象的虚函数实例化后不一定相同,所以虚函数的函数空间实际上在对象中。

知道了以上几点就可以明白,如果构造函数是虚函数,就会存在一个矛盾。类需要用构造函数生成对象,而构造函数在对象的虚函数空间中,但此时还不存在对象,不存在虚函数指针,无法调用构造函数。因此构造函数不能作为虚函数。

----------------------------------------------------------------------

接下来对函数重载进行总结

参考:http://www.cnblogs.com/xyl-share-happy/archive/2012/12/06/2804401.html

我们学过运算符重载(说实话这一块我没学好,看了下书但是什么都没记住QAQ),有三种方式:普通函数,友元函数,类成员函数

运算符重载是为了对用户自定义数据类型的数据的操作与内定义的数据类型的数据的操作形式一致。

不能重载的5个运算符:*成员指针访问运算符;::域运算符;sizeof长度运算符;?:条件运算符;.成员访问符

双目运算符重载为成员函数时,仅有一个参数。

单目运算符重载为成员函数时,不能再显式说明参数,总是隐含了一个参数,该参数是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();

原文地址:https://www.cnblogs.com/luoyang0515/p/10426129.html