`
jiagou
  • 浏览: 2516328 次
文章分类
社区版块
存档分类
最新评论

C++知识点辨析

 
阅读更多
1, c语言中,结构体struct中不能包括函数的,而在C++中struct中可以包括函数。

2,C++中结构体和类可以通用,区别主要表现在访问控制方面:struct中默认是public,而 class中默认的是private。

3,构造函数最重要的作用是创建对象的本身,C++中每个类可以拥有多个构造函数,但必须至少有一个构造函数,当一个类中没有显式提供任何构造函数,C++编辑器自动提供一个默认的不带参数的构造函数,这个默认的构造函数只负责构造对象,不做任何初始化工作。但在一个类中只要自己定义一个构造函数,不管带参不带参,编辑器不再提供默认的不带参的构造函数了。构造函数没有返回值。

4,析构函数当一个对象生命周期结束时候被调用来回收对象占用的内存空间。一个类只需有一个析构函数。析构函数没有返回值也不的带参数。

5,析构函数的作用与构造函数相反,对象超出起作用范围对应的内存空间被系统收回,或被程序用delete删除的时候,对象的析构函数被调用。

6,函数的重载条件:函数的参数类型、个数不同,才能构成函数的重载。重载是发生在同一个类中。

7,类是抽象的,不占用具体物理内存,只有对象是实例化的,是占用具体物理内存的。

8,this指针是隐含指针,指向对象本身(this指针不是指向类的),代表了对象的地址。所有的对象调用的成员函数都是同一代码段,但每个对象都有自己的数据成员。当对象通过调用它的成员函数来访问它的数据成员的时候,成员函数除了接收实参外,还接收了对象的地址,这个地址被一个隐藏的形参this所获取,通过这个this指针可以访问对象的数据成员和成员函数。

9,对象中public属性的成员在外部和子类中都可以被访问;protected属性的成员在外部不能被访问,在子类中是可以访问的;private属性在子类中和外部都不能被访问。

10,类的继承访问特性:(public,protected,private) a)基类中private属性成员,子类无论采用那种继承方式都不能访问。 b)采用public继承,基类中的public,protected属性的成员访问特性在子类中仍然保持一致。 c)采用protected继承,基类中的public,protected属性成员访问特性在子类中变为protected. d)采用provate继承,基类中的public,protected属性成员访问特性在子类中变为provate.

11,子类和基类的构造函数或析构函数调用顺序: 当调用子类的构造函数时候先调用基类的构造函数(如果没有指明,则调用基类却省那个不带参数的构造函数;如果要指明则在子类构造函数名后加":基类名(参数)")。析构函数则相反,先调用子类析构函数,后调用基类的析构函数。

12,函数的覆盖: 函数的覆盖是发生在发生父类和子类之间的。(函数的重载是发生在同一个类中) 当子类中重写了父类的某些成员函数后,子类中的成员函数覆盖了父类的对应同名成员函数。

13,用父类指针访问子类对象成员时候,只能访问子类从父类继承来的那部分。(这时候外部不可以访问父类中保护和私有的部分,子类中不可访问父类私有部分。)

14,多态性:在基类的的成员函数前加virturl变成虚函数,当用子类对象调用该功能的成员函数时候,子类有的就调用子类的,子类没有的就调用基类的。 当C++编译器在编译的时候,发现被调用的成员函数在基类中定义的是虚函数,这个时候C++就会采用迟绑定技术(late binding),在运行的时候,依据对象的类型来确定调用的哪个函数,子类有调用子类的,子类没有的就调用基类的。 如果基类中的成员函数不是虚函数,则这时候的绑定是早期绑定,在编译的时候就已经确定该调用哪个函数。

15,纯虚函数:在类中定义时 eg: virtual void f1()=0; 纯虚函数没有函数体,含有纯虚函数的类叫做抽象类,抽象类不能实例化对象。当子类从抽象类的基类中派生出来时候,如果没有实现基类中的纯虚函数,则子类也是个抽象类,也不能实例化对象。 纯虚函数被标名为不具体实现的虚成员函数,纯虚函数可以让类只具有操作的名称而不具有具体的操作的内容,让派生类在继承的时候再给出具体的定义。如果派生类没有给出基类的纯虚函数的具体定义的时候,派生类也为一个抽象类,也不能实例化对象。

16,引用:变量的别名。引用需要在定义的时候用一变量或对象初始化自己。引用一旦在定义的时候初始化,就维系在一个特定的变量或对象上。 引用不占用物理内存(与定义引用的目标共用同一内存)。指针变量需要占用物理内存,用来存储地址。

摘要:虚函数里面有一个很特殊的东东,那就是纯虚函数,关于纯虚函数的问题也是bbs上常见的话题,这里我想对此作一个小小的论述,希望能给初学者一个满意的解释。
一、引入原因:
1、为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。
2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。 为了解决上述问题,引入了纯
虚函数的概念,将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;),则编译器要求在派生类中必须予以重载以实现多态性。同时含有纯虚拟函数的类称为抽象
类,它不能生成对象。这样就很好地解决了上述两个问题。
二、纯虚函数实质: 类中含有纯虚函数则它的VTABLE表不完全,有一个空位,所以,不能生成对象(编译器绝对不允许有调用一个不存在函数的可能)。在它的派生类中,除非重
载这个函数,否则,此派生类的VTABLE表亦不完整,亦不能生成对象,即它也成为一个纯虚基类。
三、 虚函数与构造、析构函数:
1、构造函数本身不能是虚拟函数;并且虚机制在构造函数中不起作用(在构造函数中的虚拟函数只会调用它的本地版本)。 想一想,在基类构造函数中使用虚机制,则可能会调
用到子类,此时子类尚未生成,有何后果!?。
2、析构函数本身常常要求是虚拟函数;但虚机制在析构函数中不起作用。 若类中使用了虚拟函数,析构函数一定要是虚拟函数,比如使用虚拟机制调用delete,没有虚拟的析构函
数,怎能保证delete的是你希望delete的对象。 虚机制也不能在析构函数中生效,因为可能会引起调用已经被delete掉的类的虚拟函数的问题。
四、对象切片:
向上映射(子类被映射到父类)的时候,会发生子类的VTABLE 完全变成父类的VTABLE的情况。这就是对象切片。 原因:向上映射的时候,接口会变窄,而编译器绝
对不允许有调用一个不存在函数的可能,所以,子类中新派生的虚拟函数的入口在VTABLE中会被强行“切”掉,从而出现上述情况。
五、虚拟函数使用的缺点
优点讲了一大堆,现在谈一下缺点,虚函数最主要的缺点是执行效率较低,看一看虚拟函数引发的多态性的实现过程,你就能体会到其中的原因。
分享到:
评论

相关推荐

    mysql安装教程,mac,windows

    1、Mac 2、windows 3、下载MySQL 4、安装MySQL 5、使用MySQL

    生成可读取配置文件的独立运行jar程序IDEA模版工程

    周五刚躺下,前线打来语音要个下载文件的小程序,下载路径和下载码需要根据配置获取,程序需要在服务器执行。当然配置的设计是个人设计的,不然每次更新下载码都要重新出具jar包,太麻烦。多年没写独立运行的jar包了,翻阅了相关资料,最终还是功夫不负有心人。想着这种需求后续可能经常碰到,遂总结经验,整理成模版,为大家所用。 ————————————————————————————————— 原文链接:https://blog.csdn.net/xuanxiaochuan/article/details/137001184 根据文章创建的模版工程文件,下载后可直接编辑main方法,根据自己的需求自定义逻辑内容,编译后获取independent.jar文件,修改配置文件后,通过java -jar independent.jar 执行命令,正常执行。

    世界读书日ppt模板x.pptx

    世界读书日ppt模板x.pptx

    Week+5.ipynb

    Week+5.ipynb

    L型单极性单相逆变电路simulink仿真

    单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆

    pypy3.7-v7.3.8-aarch64-portable.tar.bz2

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    xx集团数字化转型方案ss.pptx

    xx集团数字化转型方案ss.pptx

    chatgpt免费使用.txt

    chatgpt免费使用

    超微 X11DPX-T主板用户手册

    超微 X11DPX-T主板用户手册

    tensorflow-2.6.2-cp36-cp36m-manylinux2010-x86-64.whl

    numpy安装

    pypy2.7-v7.2.0rc0-aarch64.tar.bz2

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    pypy2.7-v7.3.12rc2-s390x.tar.bz2

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    ddwrt.v24-vpn-generic.bin

    ddwrt.v24_vpn_generic.bin

    pypy3.7-v7.3.4-osx64.tar.bz2

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    《工业视觉检测平台的思考与应用》qy.pptx

    《工业视觉检测平台的思考与应用》qy.pptx

    输电线路涉鸟故障相关鸟种细粒度分类数据集(2889张+50类)

    内含输电线路涉鸟故障相关鸟种细粒度分类数据集,2889张图片,图像分类数据集,类别有50,可以用于电气工程专业在计算机视觉应用领域做研究,例如目标检测、图像识别、深度学习等!!! txt文件内有下载链接和提取码,放心下载即可!!!!

    毕业设计: Java项目springboot基于SpringBoot的医院药品管理系统(源码 + 数据库 + 论文)

    论文目录: 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3.1.3 经济可行性 5 3.1.4 法律可行性 5 3.2 系统性能分析 5 3.3 系统功能分析 6 3.3.1 角色需求 6 3.3.2 功能需求 6 3.4 系统流程分析 6 3.4.1 注册流程 6 3.4.2 登录流程 7 4 系统设计 8 4.1 系统概要设计 8 4.2 系统结构设计 8 4.3 数据库设计 9 4.3.1 数据库表设计 9 5 系统的实现 13 5.1 功能模块的实现 13 5.1用户信息管理 13 5.2 员工信息管理 14 5.3药品信息管理 16 5.1公告信息管理 18 6 系统测试 21 6.1 测试定义 21 6.2 测试目的 21 6.3 测试方法 21 6.4 测试分析 21

    OpenLane车道线数据集百度网盘链接(永久有效)

    总大小:114.39G OpenLane包含20万帧、超过88万条实例级车道、14个车道类别(单白色虚线、双黄色实体、左/右路边等),以及场景标签和路线邻近目标(CIPO)注释,以鼓励开发3D车道检测和更多与产业相关的自动驾驶方法。

    pypy2.7-v7.2.0-s390x.tar.bz2

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    ASCII码表 ASCII码表

    ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表

Global site tag (gtag.js) - Google Analytics