[课堂总结]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课堂记录(二) 第一节课 方法的重载:方法名相同,参数列表不同 方法的重写:方法名,参数列表相同 两同:方法名相同,参数列表相同 两小:访问权限小与等于父类,返回值类型小于等于父类(返回值 ...
随机推荐
- LayUI 子父窗体的交互
---恢复内容开始--- 收到的工作是将一个ERP的窗体程序改为网页实现,所以就肯定需要弹框来选择(如:物料编码.部门.业务员等等) 本文采取的前段框架是LayUI. layUI的官网API网址:ht ...
- [UE4]如何替换角色Mesh上的Material材质
http://www.dawnarc.com/2016/10/ue4%E5%A6%82%E4%BD%95%E6%9B%BF%E6%8D%A2%E8%A7%92%E8%89%B2mesh%E4%B8%8 ...
- python 之 time模块、datetime模块(打印进度条)
6.9 time 模块 方法 含义 备注 time.time() 时间戳 1561013092.997079 time.strftime('%Y-%m-%d %H:%M:%S %p') 结构化时间st ...
- EOS Bios Boot Sequence
EOS version:v1.0.5 Date:2018-06-19 Host: Centos 7 Reference :https://github.com/EOSIO/eos/wiki/Tutor ...
- 洛谷 P3931 SAC E#1 - 一道难题 Tree
题目背景 冴月麟和魏潇承是好朋友. 题目描述 冴月麟为了守护幻想乡,而制造了幻想乡的倒影,将真实的幻想乡封印了.任何人都无法进入真实的幻想乡了,但是她给前来救她的魏潇承留了一个线索. 她设置了一棵树( ...
- vue中的导航守卫
官方文档地址: 导航守卫:https://router.vuejs.org/zh-cn/advanced/navigation-guards.html 好的,重点内容 router.beforeEac ...
- CentOS与Ubuntu修改主机名
CentOS 1.执行hostname查看主机名 2.hostname + 主机名 使需要修改的主机名立即生效,但是下次重启会失效,故需要执行第三步 3.vim /etc/sysconfig/net ...
- Codeforces 1154G(枚举)
我预处理\(1e7log(1e7)\)的因数被T掉了,就不敢往这个复杂度想了--无奈去看AC代码 结果怎么暴举gcd剪一剪小枝就接近3s卡过去了!vector有锅(确信 const int maxn ...
- mybatis pageHelper 分页插件使用
转载大神 https://blog.csdn.net/qq_33624284/article/details/72828977 把插件jar包导入项目(具体上篇有介绍http://blog.csdn. ...
- 073 Set Matrix Zeroes 矩阵置零
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将这个元素所在的行和列都置零.你有没有使用额外的空间?使用 O(mn) 的空间不是一个好的解决方案.使用 O(m + n) 的空间有所改善,但仍不 ...