构造函数不能为虚/重载函数总结
作为一个类,他最基础的成员函数就要数构造函数了。这里我们先探讨一下构造函数为什么不能是虚函数。
在解决这个问题之前,要先明白类中函数的调用方式。一个类的函数共用一个函数空间,因此在实例化的对象中是不占空间的。每当有函数调用的时候,会有一个指向该函数空间的指针,依次开始寻找被调用函数。需要注意的是,虚函数的函数空间与普通的函数不同,因为需要类的对象将虚函数实例化,因此不同对象的虚函数实例化后不一定相同,所以虚函数的函数空间实际上在对象中。
知道了以上几点就可以明白,如果构造函数是虚函数,就会存在一个矛盾。类需要用构造函数生成对象,而构造函数在对象的虚函数空间中,但此时还不存在对象,不存在虚函数指针,无法调用构造函数。因此构造函数不能作为虚函数。
----------------------------------------------------------------------
接下来对函数重载进行总结
参考: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
构造函数不能为虚/重载函数总结相关推荐
- 继承关系中的拷贝构造函数和赋值操作重载函数分析
文章目录 1 继承关系中的拷贝构造函数和赋值操作重载函数分析 1 继承关系中的拷贝构造函数和赋值操作重载函数分析 在继承关系中,如果子类未实现拷贝构造函数,那么在子类进行拷贝构造操作时,会直接调用父类 ...
- 构造函数不能为虚函数
2019独角兽企业重金招聘Python工程师标准>>> 1,从存储空间角度 虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的.问题出来了,如 ...
- c++类指针赋值表达式必须是可修改的左值_C++学习刷题8--复制构造函数和赋值运算符重载函数...
一.前言 本部分为C++语言刷题系列中的第8节,主要讲解这几个知识点:复制构造函数和赋值运算符重载函数.欢迎大家提出意见.指出错误或提供更好的题目! 二.知识点讲解 知识点1:复制构造函数 1.当依据 ...
- c++ 复制构造函数_C++学习刷题8--复制构造函数和赋值运算符重载函数
一.前言 本部分为C++语言刷题系列中的第8节,主要讲解这几个知识点:复制构造函数和赋值运算符重载函数.欢迎大家提出意见.指出错误或提供更好的题目! 二.知识点讲解 知识点1:复制构造函数 1.当依据 ...
- 重载函数与虚函数的区别
重载函数与虚函数的区别: 重载函数只要求函数有相同的函数名,并且重载函数是在相同作用域中定义的名字相同的不同函数.而虚函数不仅要求函数名相同,而且要求函数的签名.返回类型也相同.也就是说函数原型必须完 ...
- C++类的构造函数不能为虚函数的原因
1 C++类的对象构造的时候,首先申请一片内存,然后调用构造函数进行初始化: 我们知道,存在虚函数的话,也会存在一个虚函数表vtable,而虚函数表示在什么时候产生的呢,当然是在调用构造函数之后产生的 ...
- C# 构造函数中调用虚函数
C# 构造函数中调用虚函数 using System; using System.Diagnostics; using System.Text; using System.Collections; u ...
- 为什么构造函数不能是虚函数
为什么构造函数不能是虚函数 从存储空间角度看,使用虚函数时,系统要有一定的空间开销,当一个类带有虚函数时,编译系统会为该类构造一个虚函数表(virtual function table),他是一个指针 ...
- C/C++基础语法复习(三):C++重载函数,多态,虚函数
1.重载运算符和重载函数: C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载. 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它 ...
最新文章
- 面试题 16.19.水域大小
- 【剑指offer】题目二
- java面试线程必备知识点,怼死面试官,从我做起
- python获取mac窗口坐标_[代码全屏查看]-Python3根据IP地址获取MAC地址
- GetManifestResourceStream得到的Stream是null的解决
- [leetcode]1306. 跳跃游戏 III
- 详解python 字符串
- 年度回顾 | 2019 年的 Apache Flink(文末有福利)
- I2C(smbus、pmbus)和 SPI协议
- C语言贪吃蛇大作业总结,C语言实现贪吃蛇游戏
- HpSocket源码使用
- 怎么样恢复移动硬盘格式化的数据呢?
- 关闭微信这几个功能,不然真的会泄露微信隐私
- 此beta版已额满_坚果 Pro 3 发布 Smartisan OS v7.5.0早期众测版
- 2020哈工程计算机考研复试——网络线上自述
- 第二章 第三节课 电源的等效变换
- 进阶爬虫:今日头条街拍美图
- IDEA报错 module java.base does not “opens java.lang.invoke“
- ALLyeSNO 优化版浩方 第二版 Ver:2007.06.15 清除广告 自动挤房间
- 蓝桥杯 算法训练(2)
热门文章
- ldconfig动态链接库管理以及修改ld.so.conf.d
- 一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现1
- Travis CI : 最小的分布式系统(三)
- wordpress本地mysql_如何在本地搭建和运行wordpress
- 发那科机器人控制柜示教器不通电_分享ABB机器人控制柜和本体的接线,给刚入门机器人的新人...
- unity 200.8m yoy_专场分享会|大会最新Unity、中创文旅专场预告来啦!
- Java项目:新闻发布系统(java+Springboot+ssm+mysql+maven)
- 【二级java】操作题知识点积累
- wiki多个文件一起导入_mac文件信息管理工具EagleFiler for Mac分享给大家
- 一个基于组件的动态对象系统