[课堂总结]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是解决一个类的多个成员之间数据冗余的问题的,而虚拟继承解决的是类与类之间数据冗余的问题,显然两者根本不是一个问题,我在此将问题混淆,希望大家引以为鉴。。

原文地址:https://www.cnblogs.com/aoru45/p/9833899.html