`
javatoyou
  • 浏览: 1068963 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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中会被强行“切”掉,从而出现上述情况。
五、虚拟函数使用的缺点
优点讲了一大堆,现在谈一下缺点,虚函数最主要的缺点是执行效率较低,看一看虚拟函数引发的多态性的实现过程,你就能体会到其中的原因。
分享到:
评论

相关推荐

    C++,操作系统的知识点总结,包括一些笔试题

    一、C++知识点: 1. **基本语法**:包括变量定义、数据类型(如int、char、float等)、运算符优先级、流程控制(如if-else、switch-case、for、while循环)。 2. **函数**:函数的定义、调用、参数传递(按值、按...

    C&C++.rar_C++_C/C++精华文章_c

    这些压缩包文件中的内容涵盖了从基础知识到高级主题的各种C++和C语言的知识点。 1. **Active Template Library (ATL) Frequently Asked Questions.txt**: ATL是Microsoft开发的一个库,用于简化COM(组件对象模型...

    编译原理知识点

    ### 编译原理知识点详解 #### 第一章 绪论 **1.1 名词解释** 1. **翻译程序**:是一种特殊的程序设计工具,它的主要功能是将一种编程语言(通常指源语言,如C++、Java等)编写的应用程序转化为另一种语言(目标...

    NOIP初赛知识点分块模拟题库解析.pdf

    根据提供的文件内容,我们可以提炼出一些关于计算机科学和信息技术领域的知识点,这些知识点覆盖了从基础概念到具体技术的应用。以下是详细的解析: 1. 计算机历史与基础概念: - 世界上第一台计算机:ENIAC(电子...

    Microsoft_Visual_Studio_C++2010详细教程

    ### Microsoft Visual Studio C++ 2010 详细教程知识点概览 #### 一、基础知识与概念辨析 - **Visual Studio与Visual C++的区别**: - **Visual Studio**:是一个集成开发环境(Integrated Development ...

    2021-2022计算机二级等级考试试题及答案No.10391.docx

    12. **知识点**: 在C++语言中,程序的模块化是利用类实现的。 - **解释**: 结构化程序设计强调程序的清晰结构,而面向对象编程进一步提高了代码的复用性和模块化。在C++中,通过定义类可以封装数据和操作这些数据的...

    2021-2022计算机二级等级考试试题及答案No.9780.docx

    根据提供的文档信息,我们可以总结出以下相关知识点: ### 域名系统与.edu标识 - **知识点概述**:域名系统(Domain Name System, DNS)是一种用于Internet等基于IP网络的命名系统,它将人类易于记忆的域名转换为...

    中科大软件学院科软考试回忆

    ### 中科大软件学院科软考试知识点回顾 #### C++ 秋季课程 - **考试结构**: - 第一部分:程序分析与输出预测(约64%) - 第二部分:程序设计(约36%) - **第一部分核心知识点**: - 多态性:包括类继承、虚...

    采空区三维可视化集成系统CAD交互接口研发.pdf

    基于提供的文件信息,本知识点详细阐述采空区三维可视化集成系统与CAD数据接口开发的相关技术内容。 知识点一:CAD技术在矿业的应用 CAD技术,即计算机辅助设计技术,是利用计算机及其图形设备帮助设计人员进行设计...

    嵌入式(精华贴).pdf

    #### 核心知识点概览 在《嵌入式(精华贴).pdf》这一资源中,涵盖了嵌入式领域C/C++编程的关键技术和实践,旨在为希望深入掌握该领域的工程师提供全面而深刻的洞察。以下是对该文档提及的主要知识点的深度解析: 1....

    软件工程师资格水平认证的复习资料

    - 多选题:可能需要综合运用多个知识点,考生需具备全面理解和辨析的能力。 - 判断题:要求对知识点有准确判断,避免因理解错误而答题失误。 - 实践题/案例分析:考察解决实际问题的能力,需要具备一定的分析和...

    vc++学习题目

    在压缩包中的"选择题复习资料(最终版)",很可能是包含了各种选择题形式的基础题目,这种形式的学习资料便于检验学习者对C语言基础知识的掌握程度,同时也能帮助他们在短时间内回顾大量知识点。选择题通常覆盖了...

    学年上计算机基础期末考试试卷(A 卷)答题卡(最终版).doc

    【计算机基础期末考试知识点详解】 本考试试卷是针对“大学计算机基础”的期末考核,主要测试学生对计算机基础知识的掌握程度,包括操作系统、网络基础、数据处理等核心概念。以下是根据试卷结构和部分内容解析的...

    试卷_3.rar

    由于没有具体的标签信息,我们可以根据一般考试试卷的构成来推测其中可能包含的知识点。 首先,试卷通常由以下几个部分组成: 1. **选择题**:这部分通常测试学生对基础知识的理解和记忆,包括概念辨析、定义理解...

    东南大学软件工程试卷14-15-2

    试卷可能涵盖的知识点包括但不限于: 1. **软件生命周期**:包括需求分析、设计、编码、测试和维护等阶段,考察学生对软件开发流程的理解。 2. **软件需求工程**:强调需求获取、分析、验证和管理,可能有涉及用例...

    CVT网测题(技术类)

    技术部分可能包含以下知识点: 1. **计算机基础**:了解计算机硬件和软件的基本概念,如操作系统原理、数据结构、算法分析等。 2. **编程语言**:熟悉至少一种编程语言,如C、C++、Java或Python,包括语法、变量、...

    京东2019校招网络工程师笔试题(二).docx

    ### 京东2019校招网络工程师笔试题解析 ...以上题目涵盖了数据结构、C++编程基础、网络协议以及PHP语言等多方面的知识点,通过解析这些题目可以帮助我们更好地理解相关领域的基本概念和技术细节。

Global site tag (gtag.js) - Google Analytics