当前位置: 首页 > 编程日记 > 正文

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

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

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

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

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

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

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

参考: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

相关文章:

通过data:image/png;base64把图片直接写在src里

2019独角兽企业重金招聘Python工程师标准>>> 关于用base64存储图片 网页上有些图片的src或css背景图片的url后面跟了一大串字符&#xff0c;比如&#xff1a;data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAYAAABIdFAMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZS…

算力“竞速”,企业AI落地的当务之急

充足的算力资源&#xff0c;在数据量持续增长及算法持续复杂化的前提下&#xff0c;无疑是保障人工智能应用落地效果的关键。软件定义算力——打造AI转型最佳实践8月2日&#xff0c;第四范式联合英特尔共同举办了AI实践者之声夏令营活动。第四范式基础架构负责人刘一鸣以《软件…

内存检测工具Dr. Memory的使用

Dr. Memory是一个内存调试工具&#xff0c;它是一个开源免费的内存检测工具&#xff0c;它能够及时发现内存相关的编程错误&#xff0c;比如未初始化访问、内存非法访问、数组越界读/写、以及内存泄露等。它可以在Linux、Windows、Mac OS和Android操作系统上使用。关于Dr. Memo…

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

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

.net完整的图文验证

摘自:http://blog.csdn.net/durongjian/article/details/4336380 一、创建ValidaeCode类库工程&#xff1a; 1、创建ValidaeCode类库工程&#xff0c;在[解决胜方案资源管理器]面板中&#xff0c;右键单击[ValidateCode]节点&#xff0c;并选择[属性]命令。 2、单击[属性]命令&…

Tesseract-OCR 3.04在Windows7 vs2013上编译过程

从https://github.com/tesseract-ocr/tesseract下载最新源码,commit id: 86acff5, 2016.06.07. 里面有个vs2010目录&#xff0c;用vs2013打开tesseract.sln。Tesseract依赖图像库Leptonica&#xff0c;Leptonica的编译过程可以参考http://blog.csdn.net/fengbingchun/article/d…

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

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

触类旁通,经典面试题最长公共子序列应该这么答

作者 | labuladong来源 | labuladong&#xff08;ID:labuladong)【导读】最长公共子序列&#xff08;Longest Common Subsequence&#xff0c;简称 LCS&#xff09;是一道非常经典的面试题目&#xff0c;因为它的解法是典型的二维动态规划&#xff0c;大部分比较困难的字符串问…

两分公支的IPSec***流量走总部测试

一.概述&#xff1a;在论坛上看到一个朋友发帖希望两个分支的IPSEC ***流量经过总部&#xff0c;如是搭建拓扑测试了一下&#xff0c;因为跑两个VM版的ASA8.42机器性能不过&#xff0c;所以用PIX8.0来代替ASA,应该主要配置都跟ASA8.0差不多。二.基本思路&#xff1a;A.两个分支…

OpenCV代码提取:cvtColor函数的实现

OpenCV中的cvtColor函数包括了很多颜色格式之间的转换&#xff0c;用起来很方便&#xff0c;这里对cvtColor函数的code进行了提取&#xff0c;经测试&#xff0c;和OpenCV3.1结果完全一致。实现代码cvtColor.hpp:// fbc_cv is free software and uses the same licence as Open…

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

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

三两下实现NLP训练和预测,这四个框架你要知道

作者 | 狄东林 刘元兴 朱庆福 胡景雯编辑 | 刘元兴&#xff0c;崔一鸣来源 | 哈工大SCIR&#xff08;ID:HIT_SCIR)引言随着人工智能的发展&#xff0c;越来越多深度学习框架如雨后春笋般涌现&#xff0c;例如PyTorch、TensorFlow、Keras、MXNet、Theano 和 PaddlePaddle 等。这…

大学计算机基础实验

下载2013算法实验报告.rar转载于:https://www.cnblogs.com/shajianheng/p/3381968.html

java基础(十三)-----详解内部类——Java高级开发必须懂的

java基础(十三)-----详解内部类——Java高级开发必须懂的 目录 为什么要使用内部类内部类基础静态内部类 成员内部类 成员内部类的对象创建继承成员内部类局部内部类推荐博客匿名内部类正文 可以将一个类的定义放在另一个类的定义内部&#xff0c;这就是内部类。 回到顶部为什么…

C++中函数指针的使用

A function pointer is a variable that stores the address of a function that can later be called through that function pointer. This is useful because functions encapsulate behavior.函数指针是一个指向函数的指针,函数指针表示一个函数的入口地址。指针是变量&…

只做好CTR预估远不够,淘宝融合CTR、GMV、收入等多目标有绝招

作者 | 吴海波转载自知乎用户吴海波【导读】一直以来&#xff0c;电商场景就存在 ctr、cvr、gmv、成交 uv 等多个目标&#xff0c;都是核心指标。理想情况下&#xff0c;提升 ctr 就能提升 gmv&#xff0c;但本文作者认为&#xff0c;在一定程度上&#xff0c; ctr 和 gmv 并不…

Android监听HOME按键

2019独角兽企业重金招聘Python工程师标准>>> <!-- lang: java --> class HomeKeyEventBroadCastReceiver extends BroadcastReceiver {static final String SYSTEM_REASON "reason";static final String SYSTEM_HOME_KEY "homekey";// …

OpenCV代码提取:merge/split函数的实现

对OpenCV中的merge/split函数进行了实现&#xff0c;经测试&#xff0c;与OpenCV3.1结果完全一致。merge实现代码merge.hpp&#xff1a;// fbc_cv is free software and uses the same licence as OpenCV // Email: fengbingchun163.com#ifndef FBC_CV_MERGE_HPP_ #define FBC_…

DeepMind提图像生成的递归神经网络DRAW,158行Python代码复现

作者 | Samuel Noriega译者 | Freesia编辑 | 夕颜出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】最近&#xff0c;谷歌 DeepMInd 发表论文( DRAW: A Recurrent Neural Network For Image Generation&#xff09;&#xff0c;提出了一个用于图像生成的递归神…

其他进制的数字

JS中如果需要表示16进制的数字,则需要以0X开头 0X10 八进制数字以0开头 070 070有些浏览器会以8进制解析,但是有些则用10进制解析,10进制为70,8进制为56 所以parseint() 第二个参数可以设定进制,比如 parseint(“070”,10)代表以10进制解析070 2进制以0b开头,但是不是所有浏览…

java中的移位运算符

移位运算符是在数字的二进制形式上进行平移。主要有左移&#xff08;<<&#xff09;、带符号右移&#xff08;>>&#xff09;以及无符号右移&#xff08;>>>&#xff09;。左移运算符&#xff08;<<&#xff09;的运算规则为&#xff1a;按二进制形…

C++11中nullptr的使用

在C语言中&#xff0c;NULL实际上是一个void* 的指针&#xff0c;然后把void* 指针赋值给其它类型的指针的时候&#xff0c;会隐式转换成相应的类型。而如果用一个C编译器来编译的时候是要出错的&#xff0c;因为C是强类型的&#xff0c;void* 是不能隐式转换成其它指针类型的。…

埃森哲、亚马逊和万事达卡抱团推出的区块链项目有何神通?

据外媒报道&#xff0c;今日埃森哲宣布了一项新的区块链项目&#xff0c;该项目为基于区块链的循环供应链&#xff0c;将与万事达卡和亚马逊共同合作。据官方介绍&#xff0c;这个基于区块链的循环供应链能够让客户识别供应链上的小规模供应商和种植者&#xff0c;例如&#xf…

小团队如何玩转物联网开发?

近几年来&#xff0c;物联网发展迅速&#xff1a;据中商产业研究院《2016——2021年中国物联网产业市场研究报告》显示&#xff0c;预计到2020年&#xff0c;中国物联网的整体规模将达2.2万亿元&#xff0c;产业规模比互联网大30倍。与之相反的是&#xff0c;物联网开发者在开发…

Build Boost C++ libraries for x32/x64 VC++ compilers on Windows

2019独角兽企业重金招聘Python工程师标准>>> Boost is a set of libraries for the C programming language that provide support for tasks and structures such as linear algebra, pseudorandom number generation, multithreading, image processing, regular …

C++11中auto的使用

在C语言中&#xff0c;就有了auto关键字&#xff0c;它被当作是一个变量的存储类型修饰符&#xff0c;表示自动变量(局部变量)。它不能被单独使用&#xff0c;否则编译器会给出警告。在C11标准中&#xff0c;添加了新的类型推导特性。在C 11中&#xff0c;使用auto定义的变量不…

攻和防谁更厉害?AI技术在恶意软件检测中的应用和对抗

AI技术的发展为网络安全带来新机遇的同时&#xff0c;黑客也在逐渐利用AI漏洞建立对抗样本以躲避攻击&#xff0c;双方在各自领域的更多尝试也将是AI技术发展的一场新博弈。那么&#xff0c;在应用中&#xff0c;如何利用AI检测技术与恶意软件展开对抗&#xff1f; 腾讯安全技术…

一文看懂机器学习中的常用损失函数

作者丨stephenDC编辑丨zandy来源 | 大数据与人工智能&#xff08;ID: ai-big-data&#xff09;导语&#xff1a;损失函数虽然简单&#xff0c;却相当基础&#xff0c;可以看做是机器学习的一个组件。机器学习的其他组件&#xff0c;还包括激活函数、优化器、模型等。本文针对机…

Using Apache2 with JBoss AS7 on Ubuntu

大体思路同《Using Apache Web Server with Jboss AS 7》一致&#xff0c;但在Ubuntu上的操作与之前有些区别。 这里仍然演示mod_proxy的配置。 首先加载相应的模块。Ubuntu中加载模块和卸载模块均可以通过命令操作&#xff0c;与其对应的命令分别是a2enmod和a2dismod。 启用…

OpenCV代码提取:rotate函数的实现

OpenCV中并没有直接提供实现rotate的函数&#xff0c;这里通过getRotationMatrix2D和warpAffine函数实现rotate&#xff0c;并增加了一个crop参数&#xff0c;用来判断是否进行crop。目前支持uchar和float两种类型&#xff0c;经测试&#xff0c;与OpenCV3.1结果完全一致。公式…