[课堂总结]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课堂记录(二) 第一节课 方法的重载:方法名相同,参数列表不同 方法的重写:方法名,参数列表相同 两同:方法名相同,参数列表相同 两小:访问权限小与等于父类,返回值类型小于等于父类(返回值 ...
随机推荐
- Git 分支管理 Feature分支 强行删除分支
软件开发中,总有无穷无尽的新的功能要不断添加进来. 添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了, 所以,每添加一个新功能,最好新建一个feature分支, 在上面开发,完成后 ...
- js函数-构成
前言 函数是一种封装,在任何语言中都是一个核心概念.在js中,函数是做为对象的子类型存在的.可以拥有自己的属性和方法,可以做为值进行传递,这两个特性让js拥有使用函数式编程的能力. 函数的声明 字面量 ...
- glassfish cluster 搭建
http://blog.csdn.net/wych1981/article/details/8815150
- UML工具 PlantUML SequenceDiagram
- 01.html5+phonegap跨平台移动应用开发
一.html5+PhoneGap基础知识 (1)html5介绍 HTML5是用于取代1999年所制定的 HTML 4.01 和 XHTML 1.0 标准的 HTML 标准版本,现在仍处于发展阶段,但大 ...
- Jmeter 跨线程组传递参数 之两种方法
终于搞定了Jmeter跨线程组之间传递参数,这样就不用每次发送请求B之前,都需要同时发送一下登录接口(因为同一个线程组下的请求是同时发送的),只需要发送一次登录请求,请求B直接用登录请求的参数即可,直 ...
- POJ-3177-RedundantPaths(边联通分量,缩点)
链接:https://vjudge.net/problem/POJ-3177#author=Dillydally 题意: 有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可 ...
- 7-36 旅游规划 (25 分(Dijkstra)
有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有若干条路径都是最短的,那么需要输出最便 ...
- Unbuntu 自动重启MySQL
上个月,通过Unbuntu搭建了WordPress,一切运行良好. UBUNTU搭建WORDPRESS-MYSQL-APACHE 但是,最近几天,不知道啥情况,MySQL偶尔会出现Stop:影响了bl ...
- 整数的lqp拆分
题目大意 lqp在为出题而烦恼,他完全没有头绪,好烦啊… 他首先想到了整数拆分.整数拆分是个很有趣的问题.给你一个正整数N,对于N的一个整数拆分就是满足任意m>0,a1 ,a2 ,a3…am&g ...