[课堂总结]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课堂记录(二) 第一节课 方法的重载:方法名相同,参数列表不同 方法的重写:方法名,参数列表相同 两同:方法名相同,参数列表相同 两小:访问权限小与等于父类,返回值类型小于等于父类(返回值 ...
随机推荐
- Spring Data JPA stackoverflow
1.禁止使用lombok 的@Data 注释 使用@Data注释后,默认会重写父类的toString()方法,hashcode()等方法,在往map里存的时候,会根据equals和hashcode方法 ...
- 51nod1186(Miller-Rabin)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1186 题意:中文题目诶- 思路:miller_rabin模板 ...
- 用户角色权限查询添加bug集锦 用户密码加密 MD5 加盐 随机盐 spring的加密bcrypt
package cn.itcast.encode; import org.apache.commons.lang3.RandomStringUtils; import org.springframew ...
- edge 浏览器自动识别电话号码解问题解决方法
解决方案:再head中加上: <meta name="format-detection" content="telephone=no">
- C# Monitor与线程同步
Monitor对象(C#知识点总结系列:4.C#中Monitor和Lock以及区别) 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁, ...
- Django-Rest-Framework的序列化之serializers 序列化组件
Django-Rest-Framework的序列化之serializers 序列化组件 restful framework 正常的序列化 from django.http import HttpRes ...
- BZOJ 1116: [POI2008]CLO 并查集
成立时当且仅当每个联通块都有环存在.一个连通块若有m个点,则必有多于m条有向边,可用并查集来维护. #include<cstdio> #include<iostream> #d ...
- POJ-3352-RoadConstruction(边双联通分量,缩点)
链接:https://vjudge.net/problem/POJ-3352#author=0 题意: 给一个无向连通图,至少添加几条边使得去掉图中任意一条边不改变图的连通性(即使得它变为边双连通图) ...
- 博弈论 && 题目
终于我也开始学博弈了,说了几个月,现在才学.学多点套路,不深学.(~~) 参考刘汝佳蓝书p132 nim游戏: 假设是两维的取石子游戏,每次可以在任意一堆拿任意数量个(至少一根,因为这样游戏的状态集有 ...
- Kaggle八门神器(一):竞赛神器之XGBoost介绍
Xgboost为一个十分有效的机器学习模型,在各种竞赛中均可以看到它的身影,同时Xgboost在工业届也有着广泛的应用,本文以Titanic数据集为研究对象,简单地探究Xgboost模型建模过程,同时 ...