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

news/2024/7/2 2:03:47
构造函数不能为虚/重载函数总结

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

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

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

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

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

参考: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();

posted on 2019-02-24 14:35 BlackDn 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/luoyang0515/p/10426129.html


http://lihuaxi.xjx100.cn/news/236131.html

相关文章

Python基础02-Python基础

脚本的第一行 Python脚本的第一行&#xff0c;写Python解释器的路径。这样就可以直接执行Python脚本。 脚本编码 Python2需要指定脚本的编码&#xff0c;Python3不需要指定。 # -*- coding:utf8 -*- 使用input做简单的交互 username input(请输入用户名密码:) password …

JVM GC算法

可达性算法 - 对象生死判定算法 Java通过可达性分析来判定对象是否还被引用。什么是可达性分析呢&#xff1a; Java会从一些叫做GCRoot的对象开始向下遍历&#xff0c;可以遍历到的对象&#xff0c;就是被引用的对象&#xff0c;不可以遍历到的对象就是不可达对象&#xff0c;就…

手把手教你如何新建scrapy爬虫框架的第一个项目(下)

前几天小编带大家学会了如何在Scrapy框架下创建属于自己的第一个爬虫项目&#xff08;上&#xff09;&#xff0c;今天我们进一步深入的了解Scrapy爬虫项目创建&#xff0c;这里以伯乐在线网站的所有文章页为例进行说明。在我们创建好Scrapy爬虫项目之后&#xff0c;会得到上图…

拜托,面试别再问我时间复杂度了!!!

最烦面试官问&#xff0c;“为什么XX算法的时间复杂度是OO”&#xff0c;今后&#xff0c;不再惧怕这类问题。 快速排序分为这么几步&#xff1a; 第一步&#xff0c;先做一次partition&#xff1b; partition使用第一个元素tarr[low]为哨兵&#xff0c;把数组分成了两个半区&a…

Python基础03-运算符

运算符 算数运算符 算数运算符符号运算数字用法举例字符串用法举例加a 2 3 print(a) # 5s1 "hello" s2 "world" s s1 s2 print(s) # helloworld-减a 12 - 3 print(a) # 9*乘a 12 * 3 print(a) # 36s1 "hello" s2 "world" s…

【Laravel-海贼王系列】第九章, Events 功能解析

Events 注册 框架如何在启动的时候加载注册的事件?框架如何触发事件?1&#xff0c;先在容器中注册 events 的全局对象。 Application 构造函数中对 events 进行注册代码 protected function registerBaseServiceProviders(){$this->register(new EventServiceProvider($th…

org.springframework.data.redis 一次连接获取特定key所有k-v(pipeline)

2019独角兽企业重金招聘Python工程师标准>>> 当我们需要一次性获取在redis中以hash方式存储的所有key-value时&#xff0c;我们可以使用下面的方式来获取。 public void testGetMore() throws IOException {RedisCallback<List<Object>> pipelineCallba…

关于java.util.LinkedHashMap cannot be cast to ......的解决办法

今天在项目中遇到一个问题&#xff0c;接口接收到list在对list进行遍历的时候报出如下错误: 断点看一下这个list感觉没有任何的问题: 那为什么会报这个错误呢 这个接口是这样的&#xff0c;在想会不会是json在转list的时候把这个list给整坏了。 于是&#xff0c;我把这个list再…