[课堂总结]C++课堂总结(二)
近期的面向对象程序设计的不容易记忆或者理解的东西进行一个总结,以后忘记了可以常来看下,C++是个很重要的东西,很多领域都用得到,加油,特种兵!
浅拷贝构造、深拷贝构造
浅拷贝构造是系统默认的拷贝构造函数,也就是说,不申明的话,系统会默认使用浅拷贝构造函数进行拷贝构造。那么浅拷贝构造存在的意义是什么,首先,浅拷贝构造是只拷贝基本空间的数据成员,而不拷贝其附带的堆空间中的数据成员,举个例子来说,比如Class A类里面有个指针变量,这个指针变量指向A类的对象a申请的堆空间,这时候如果直接拷贝构造a得到b,那么b中这个指针的指向也是a中的堆空间,这时候当a销毁的时候,b指针的指向就有问题了。这时候,深拷贝就出现了,通过深拷贝在b中也申请一个堆空间,那么b指针就指向自己的堆空间了,就解决了上面的问题了,所谓深拷贝,就是自己写一个申请空间的函数,大致是这个意思。
类模板和模板类
类模板---实例化--->模板类,即某个template <typename T> class是类模板,但是他的T为具体的数据类型时候就是模板类。
冒号语法
冒号语法的出现是为了解决在构造函数执行时要用到成员类时没有初始化的问题,使用冒号语法即在构造函数后面加上冒号,写上成员类的初始化,这与直接在构造函数李赋值是不一样的,在构造函数之前完成的是初始化而不是赋值。要注意的是,其后成员描述与其书写顺序是无关的。
函数后加const是什么意思
有时候我们要求参数是只读的,那么通常做法就是在参数前加上const,当参数过多时,我们懒得一个一个加const,于是我们不如在函数后面加个const,意思跟每个参数后面加const一样,只不过是个简便写法。
静态数据成员
某个类的不同对象有一些一模一样的数据,这就导致了数据的冗余,大家都是一样的,比如Student类都有班级人数这个变量成员,而将其static之后就只有一个数据了,之后Student类的实例化对象就不会再定义了。
静态成员函数:类没有创建对象时,要操作其静态的数据成员,就只能通过静态成员函数来执行,函数前面加个static就是静态成员函数了。
静态数据成员:类内声明,类外定义(初始化)。
友元
某各类中声明一个友元函数,则在类外可以通过该函数访问该类的private和protected成员,相当于开了后门。
友元类:友元类的所有成员函数均为本类的友元函数,均能访问本类的所有成员,相当于给一个类开了一个后门。例如,在A类中friend B类,那么B能操作A类的所有数据成员。要注意的是,实际使用的时候,B的定义在A后,但B必须在A前声明。
继承和多态
继承
默认会继承元类的所有数据成员(除构造函数、析构函数、拷贝构造之外),其中三种继承方式public、private、protected继承方式的效果一样。因此需要自己写继承类的构造函数、析构函数和拷贝构造函数。
多态
虚函数:“一个接口,多个方法”,这句话概括了虚函数的作用。虚函数实现的作用其实是动态绑定,比如,基类声明show为虚函数,两个派生类继承基类,分别写该继承类的show函数的定义,由于基类会兼容派生类,那么基类调用show函数的时候,不能知道调用的是派生类的哪个show函数,实验后发现调用的其实是基类的show函数,但是基类的show函数我们只生命了但没定义。而虚函数恰恰解决了这个问题,函数声明为虚函数之后,调用show 的时候,会根据其数据类型定态绑定show函数,然后调用。
纯虚函数:虚函数声明后加=0,即为纯虚函数。纯虚函数只是声明,不能做任何事情。
抽象类:至少有一个纯虚函数的类成为抽象类。抽象类的唯一作用就是被继承,不能创建抽象类的对象。
虚拟继承
看下面的图就很明显了,Son继承了f1和f2,f2继承了gf,那么如果不是虚拟继承,比如gf有数据成员int a=0,在f1中改为2,f2中改为3,那么son继承的a是多少呢?这就出现了二义性。
要解决这个问题,就要用到虚拟继承,f1和f2虚拟继承gf,这时候a只有一份,f1和f2改变了a,就相当于他们操作同一个数据成员,那么son继承的a永远是gf的a,就不存在二义性了。这让我想到了另一个解决办法,我们直接在a之前static不行吗?静态数据成员同样支持继承,那么这个效果应该和虚拟继承是一样的吧?同时,考虑到虚拟继承也会继承gf的函数,那么我们在gf的函数前加上static不是也一样达到了效果吗?所以为就有个疑问了,既然static能解决的问题,为什么要用虚拟继承?这个东西存在的意义是什么????
后记:
后来我去问了老师,我发现我把问题搞混了。static是解决一个类的多个成员之间数据冗余的问题的,而虚拟继承解决的是类与类之间数据冗余的问题,显然两者根本不是一个问题,我在此将问题混淆,希望大家引以为鉴。。
[课堂总结]C++课堂总结(二)的更多相关文章
- 20155216 2017-2018-1 《信息安全系统设计基础》第二周课堂练习补交以及Myod的实现
20155216 2017-2018-1 <信息安全系统设计基础>第二周课堂练习补交 课堂测试3:行断点的设置 运行截图: 未完成原因:课前未安装 cgdb 具体步骤: 1.输入命令:gc ...
- 20155326 第12周课堂实践总结(二)String类和Arrays类的学习
20155326 第12周课堂实践总结(二)String类和Arrays类的学习 实践二 Arrays和String单元测试 实践题目 在IDEA中以TDD的方式对String类和Arrays类进行学 ...
- 20155207JAVA第十二周课堂练习
20155207JAVA第十二周课堂练习 教材代码检查--P98 修改教材P98 Score2.java, 让执行结果数组填充是自己的学号 Arrays和String单元测试 在IDEA中以TDD的方 ...
- 20155213 第十二周课堂作业MySort
20155213 第十二周课堂作业MySort 作业要求 模拟实现Linux下Sort -t : -k 2的功能 参考 Sort的实现 提交码云链接和代码运行截图 初始代码 1 import java ...
- 20155233 《Java程序设计》第十二周课堂练习总结
20155233 <Java程序设计> 第十二周课堂练习总结 测试题目 1.修改教材P98 Score2.java, 让执行结果数组填充是自己的学号:提交在IDEA或命令行中运行结查截图, ...
- 20155320 2016-2017-2《Java程序设计》第十二周课堂实践项目
20155320 2016-2017-2<Java程序设计>第十二周课堂实践项目 1.修改教材P98 Score2.java, 让执行结果数组填充是自己的学号: 2.在IDEA中以TDD的 ...
- 20155322 2016-2017-2 《Java面向对象程序设计》第十二周课堂练习之Arrays和String单元测试
20155322 2016-2017-2 <Java面向对象程序设计>第十二周课堂练习之Arrays和String单元测试 练习目地 在IDEA中以TDD的方式对String类和Array ...
- 二.OC基础--1,对象的存储细节,2,#pragma mark指令,3,函数和对象方法的区别,4,对象和方法之间的关系 ,5.课堂习题
1,对象的存储细节, 1. 当创建一个对象的时候:Person *p1 = [Person new],做了三件事情: 1,申请堆内存空间: 2,给实例变量初始化: 3,返回所申请空间的首地址; 2. ...
- Java学习笔记二--API课堂记录
JavaSE课堂记录(二) 第一节课 方法的重载:方法名相同,参数列表不同 方法的重写:方法名,参数列表相同 两同:方法名相同,参数列表相同 两小:访问权限小与等于父类,返回值类型小于等于父类(返回值 ...
随机推荐
- Unable to start services for VMware Tools
vmware安装扩展工具报错的问题 vmware安装扩展工具报错Creating a new initrd boot image for the kernel.update-initramfs: Ge ...
- linux jar 后台运行
在linux系统中可以利用nohup来执行任何命令,并把命令自动调到linux后台运行,不锁定当前ssh窗口,也不会被ctrl + c,alt + F4之类打断程序的动行.如: nohup java ...
- hdu 3037 费马小定理+逆元除法取模+Lucas定理
组合数学推推推最后,推得要求C(n+m,m)%p 其中n,m小于10^9,p小于1^5 用Lucas定理求(Lucas定理求nm较大时的组合数) 因为p数据较小可以直接阶乘打表求逆元 求逆元时,由费马 ...
- UniqueIdentifier 数据类型
UniqueIdentifier 数据类型用于存储GUID的值,占用16Byte. SQL Server将UniqueIdentifier存储为16字节的二进制数值,Binary(16),按照特定的格 ...
- ubuntu18.04安装配置opencv3.4.0
1.安装配置相关工具及依赖库 sudo apt-get install build-essential # 必须的,gcc编译环境 sudo apt-get install cmake git lib ...
- <!--[if !IE]> 的用法
除IE外都可识别
- MySQL生成UUID
UUID函数 在MySQL中,可以用uuid()函数来生成一个UUID,如下图: replace函数 默认生成的uuid含有'-',我们可以使用replace函数替换掉'-',SQL如下: selec ...
- 洛谷P3645 [APIO2015]雅加达的摩天楼(最短路+分块)
传送门 这最短路的建图怎么和网络流一样玄学…… 一个最朴素的想法是从每一个点向它能到达的所有点连边,边权为跳的次数,然后跑最短路(然而边数是$O(n^2)$除非自创复杂度比spfa和dijkstra还 ...
- Java基础--常用API--日期相关API
一.java.util.Date 1.只用于显示系统时间,其大部分操作由Calendar代替. 格林威治时间(GMT):指的是1970年1月1日0时,不同地区有时间差. 默认输出格式:星期.月.日.时 ...
- 洛谷 P1908 逆序对(归并排序解法)
树状数组解法:https://www.cnblogs.com/lipeiyi520/p/10846927.html 题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不 ...