类的简述

c++的语言特性支持oop和gp编程。
oop是指面向对象编程。gp是指泛型编程。

c++的核心特征就是class
一个好的class应满足以下条件:正确、 易维护、高效、优雅、易使用、易读、易理解

实体类、抽象类、类继承是class的三大基础模块

实体类
如果她的行为看起来像一个内置类型,就可以称为实体类
eg:vector string 看起来像一个内置类型,除此之外她的行为更丰富

容器:一个对象,可以存储一系列元素

构造和析构函数是一种优雅的技术,也是c++基本的资源管理的技术
资源在构造中初始化,在析构中释放,这就是典型的Resource Acquisition Is Initialization(RAII)

构造函数的初始化列表 {}

抽象类
相比实体类,抽象类屏蔽了类的实现
virtual:may be redefined later in a class derived from this one
纯虚函数表示:子类必须实现这个函数
如果一个类带有纯虚函数,那么这个类称为抽象类
一个类为其他不同类型的类提供接口,这种成为多态
抽象类不需要构造函数,毕竟她没有数据需要初始化
专业术语:子类(subclass)、父类(superclass)
派生类可以称为基类的一个继承成员,所以在继承体系中,常称基类和派生类
在派生类中实现基类的成员,可称为override

在多态的引用中有一张表称为虚函数表vtbl(virtual function table)
每一个含有虚函数的类都有自己的这么一张表,用来定位自己的虚函数,相比不含有虚函数的类,在空间上只是多了一个vtbl的指针

类继承
由推导(eg, : public)而创建的一个类的集合
虚析构函数:如果基类指针指向派生类对象,使用虚析构函数可以保证析构时调用派生类的析构函数。当类中有虚函数时,才将析构函数弄成虚析构。

虚析构函数调用机制,只是保证了可以正确调用到派生类的析构。

override:基类的虚函数,在派生类中重写
有个比较好的方式就是在派生类中 针对基类的虚函数添加override关键字,来显示指出这个函数是override的。这一点在google的开源库中很常见。

类继承有啥好处
第一:接口继承。任何需要基类的地方,派生类都可以用上。这些个基类常常是抽象类。
第二:现实继承。基类可以提供一些已实现的函数和数据,这样派生类都可以用到。这些个基类常常会提供数据成员和构造函数。

具体类表现的像是一个内置类型(本地变量、访问是直接用就行)。类在继承体系中就有所不同(一般用new申请,用指针或是引用来访问)

当一个基类指针指向派生类对象时,这时如果需要调用派生来的某些特别的接口(基类没有的),可以用dynamic_cast来进行转换。

dynamic_cast如果转换失败,返回nullptr

防止资源泄漏
在极少数情况下我们使用了new,而忘了delete,这时会导致资源泄漏
新标准推荐我们使用unique_ptr

当一个类是一个资源句柄(通过指针访问类里的对象),这时赋值操作会违背类的不变式(eg:如果复制一个容器,当一个容器的大小改变时,另一个容器的不变式就出错了)。所以类最好包含两个成员:拷贝构造和复制赋值。
A(const A& a);
A& operator=(const A& a);

新标准向前发展出了移动构造和移动赋值
在具体了解这个知识点之前,我们先了解一下新标准中的新玩意 && 右值引用
在c++11中引入的概念rvalue reference,右值引用,写法类似于T&&。
右值引用分3种:无名、有名、转发。
无名和有名在这而的意思可以参考namespace的无名有名。
无名和有名主要是解决移动语义的问题,转发主要是解决完美转发的问题

关于右值引用的东西上一篇文章中已经描述了一部分,现在就不说了

一个类中比较重要的几个操作:
构造、析构、拷贝、移动。这几个并不是逻辑上独立的。eg:拷贝构造、移动赋值。
新标准为了提高编程效率,对于上面借个特殊的操作,添加了”=default”和”=delete”;前一个表示,嗨哥们,不用写函数体了,让编译器自动加一个高效的实现;后一个表示,嗨哥们,这个实现已经被disable了

如果构造函数只有单个参数,那么这时的写法就很自由:
V a(123);
V b = 456;
第二种情况看起来就不那么优雅,推荐使用explicit来修改构造函数

资源管理

额外话题(新标准向前走了一大步:提供了线程库)
资源包括很多方面:内存、系统线程、文件句柄、socket、锁等,这些资源被我们使用的时候大多使用指针句柄来引用,新标准推荐我们使用stl中的类型来代替,eg:unique_ptr、thread、vector、string、fstream等,这样可以减少资源泄漏,这些都是c++的gc(垃圾回收机制,不需要我们考虑资源释放),使用这些可以使代码更加优雅更加健壮。

Garbage collection:gc,全局内存管理机制

泄漏一般出现在长时间运行的程序中。如果一个程序占用了太多资源,这种情况和泄漏一样,好不到哪去。
在c++中raii(Resource Acquisition Is Initialization)非常普遍,这些都可以解决泄漏或是占用资源太多的情况。

在类继承中默认的拷贝和移动是不可取的,eg:基类有一个指针,但是不知道派生类中有哪些成员,所以就无法拷贝,这时就需要=delete

class A{
public:
    A(const A&) = delete;
    A& operator=(const A&) = delete;
    A(A&&) = delete;
    A& operator=(A&&) = delete; 
};

=delete 也有人称为“抑制操作”

基类一般很少有拷贝和移动 ,如果非要这么做 ,就是用virtual吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值