【C/C++】:C++总体回顾

2023-10-30


摘要

本篇文章主要用于C++一些专有名词的解释以及对C语言扩充功能的说明,如果想详细了解C++的用法以及代码的讲解建议参考其他专业书籍。


一、封装

1、面向对象程序设计方法的基本原理:
(1)抽象:在众多事物中提取共同的、本质的特征,将客观事物抽象成类和对象。
(2)封装:将对象的属性和行为结合成一个独立的单元,隐蔽内部细节。
(3)继承:子类拥有父类所有的属性和行为,并且还拥有自己独有的属性行为。
(4)多态:不同的对象接收到相同的消息时,可能会以不同的行为实现来响应消息。
2、类成员的访问权限
(1)public: 类外可以访问。
(2)private:类外无法访问。
(3)protected:类外无法访问,但可以被派生类成员函数访问。
3、构造函数:在对象被创建时分配内存空间,初始化对象的数据成员,将对象构造成一个特定的状态。(主要是给私有数据成员赋初值)。
4、析构函数:对象被销毁时资源需要被释放。
5、this指针:一个常量指针,是一种自动生成和隐藏的私有成员。存在于类的非静态成员函数中,指向调用该成员函数的对象。作用域是在类内部。用途在于类的非静态成员函数返回类本身时(return this;);参数与数据成员同名时(this->n=n;)。
6、静态成员(static):解决数据共享的问题。全局变量由于所有的函数都能调用,所以不安全,若想在同类的多个对象之间实现数据共享,可用类的静态数据成员来实现。类的静态成员变量的生命周期与整个程序相同。
   静态数据成员需要在类内声明(static int counter;),类外初始化(int Point::counter = 0;)
   静态成员函数用来操纵同类中的静态数据成员,没有this指针,访问非静态数据成员比较麻烦。
7、友元关系(friend):包含友元关系的类中的私有成员变量对朋友公开。没有this指针,友元函数可直接访问类中所有成员,但不是该类的成员。如果友元函数要操作类的数据成员,必须通过参数传递该类的对象来进行(fDist(CPoint
p1,CPoint* p2))。
8、共享数据保护(const)
(1)常引用:所引用对象不能被修改,常引用作为形参时可以保证实参不会被意外修改(print(const int &n);)
(2)常对象:一个对象自创建起就不再改变其状态,即他的所有数据成员的值都不再改变(不能调用)。一般用于对象的引用上(friend double fDist(const CPoint &p1,const CPoint &p2);)
(3)常成员:常成员函数(int GetValue() const)
      常数据成员(const int a;),初始化需要在构造函数的初始化列表中完成。(A(int i):a(i){})


二、继承

1、派生类:继承基类的所有数据成员和除了构造函数、析构函数之外的全部成员函数。
2、继承方式:
(1)公有继承public
   派生类:public和protected不变,private无法访问。
   派生类对象:public可访问,protected、private无法访问。
(2)私有继承private
   派生类:public和protected变为private,private无法访问。
   派生类对象:都无法访问。
(3)保护继承protected
   派生类:public和protected变为protected,private无法访问。
   派生类对象:都无法访问。
3、派生类的构造函数:基类的成员必须在初始化列表中进行。Car(int w,int wei,int p):Vehicle(w,wei){}
4、派生类的析构函数:执行派生类的析构函数时,基类的析构函数被自动调用。析构派生类,再析构基类。(A构造->B构造->B析构->A析构)
5、多继承的二义性:不同基类继承来的成员同名而产生二义性问题,同名数据成员分别占用两块存储空间,系统不知道访问哪个。
6、虚基类(virtual):解决多继承同名成员的唯一标识问题(在继承子类中加virtual)。
7、组合类: 在一个类的数据成员中含有一个或者多个类对象,以数据成员出现的类对象叫子对象。子对象的访问权限是私有,构造函数中需要对子对象也初始化。(基类,自己,子对象)


三、多态

1、多态性的两种表现
(1)函数重载(同一对象的相同函数名可能产生不同行为,属于静态绑定)
(2)虚函数(不同对象在收到同一消息时可能产生不同行为,属于动态绑定)
2、虚函数(virtual):基类中用virtual修饰的成员变量,仅适用于有继承关系的类对象。虚函数在基类和派生类之间提供了同名接口界面,即使用相同名字的虚函数可以在派生类中被重新定义,以实现不同的函数功能。动态调用需要使用指向基类对象的指针(CShape *poCS; poCS=&oCS; poCS->Show();)或引用(定义引用函数:void Reference(const CShaoe &roCS) {roCS.Show();})来调用虚函数。静态调用直接调用即可(oCS.Show())。
3、虚函数的覆盖:派生类与基类同名函数原型完全相同且为虚函数,则构成覆盖。
4、虚函数的隐藏:派生类与基类同名函数原型完全相同,则派生类会自动隐藏基类同名函数,则属于隐藏。
5、虚函数的传递性:通过基类的指针或引用可以调用该基类派生的所有派生类的所有原型相同的函数,且都具有动态多态性。
6、虚析构函数:在有继承关系时,析构函数应设计为虚函数。采用虚析构函数可确保在多重继承情况下将对象完全销毁。(直接在基类的虚构函数前加virtual)
7、纯虚函数:纯虚函数是在声明为虚函数的同时将其“初始化”为0。纯虚函数在基类中只有声明没有定义,定义由基类的派生类去定义。(virtual void Show() const=0;)
8、抽象类:含有纯虚函数的类只能用于创建派生类,不能用于创建对象,因此该类叫做抽象类。只有在派生类中实现了其所有的纯虚函数之后,该派生类才可用于创建对象。可定义抽象类指针和引用去访问其派生类,从而使结构更清晰。
9、函数重载的二义性:含有隐式转换,重载函数无法判断该调用哪一个。
10、运算符重载:可让C++运算符作用于用户自定义的数据类型。
11、成员函数的重载:函数的参数个数比原来参与运算的运算数少1,被重载的运算符的第一操作数的类型是确定的,隐含的,不可改变的,必须为自定义类型(this)。
12、非成员函数的重载:函数的参数个数与参与运算的运算数相同。
   Bool operator>(COperator ob){};
   Int operator++(int i);
13、直接赋值运算符(=)的重载:注意当存在指针变量时,常规赋值后指针释放时复制的指针变量无法释放,从而产生“垃圾信息”。所以需要重载赋值运算符,使其从“浅复制”变为“深复制”。


四、模板与标准模板库

1、模板是以变量的数据类型作为参数,通过改变数据类型可以生成不同的函数和类。
   TemplateT max(T a){};
   Templateclass TClass{};
2、标准模板库(STL):包含容器,算法和迭代器三个部分。容器包含大多数数据结构的函数模板,算法包含查询排序等系统函数模板,迭代器将容器和算法关联起来。
3、迭代器:for(int *it=begin;it!=end;it++){};
4、函数对象:Fun &ForEach(const it &begin,const it &end,Fun &f){}; (返回函数的引用)
5、常用容器:vector,list,deque,queue,stack。
6、常用算法:遍历容器for_each(),查询算法find(),排序算法sort()。


五、其他

1、插入和提取运算符(<<和>>):都是从左到右依次输入与输出。
2、作用域限定符(::):用于类成员的访问和定义,用于说明某一成员属于哪个类。
3、内联函数(inline):只能出现在函数的定义上(声明中出现无效),常规的函数调用过程较为复杂(记录地址,开辟内存等),用内联函数直接将函数替换为内联函数内的代码,可以减小相应的开销,但是只适用于短小且调用频繁的函数。(类内实现的成员函数默认为内联函数)。
4、函数重载:允许在相同作用域中用同一函数名定义多个函数。
5、引用(int &j=i):为i起别名为j,对j的所有操作都是对i的操作,并且共享同一内存单元。
6、动态内存管理:内存数据区有三种分区,静态数据区(存放全局,static变量,生命周期贯穿整个程序运行过程),堆区(存放动态申请变量,new,delete,生命周期由程序员自己定),栈区(存放局部变量和形式参数等,生命周期与函数同在,结束即被释放)。
7、new能自动计算出所申请空间的大小,还能返回正确的指针类型,而malloc需要由程序员指定。
指针变量声明后没有初始化就通过它操作内存空间,则可能会造成“野指针”。delete以后不对指针变量做任何处理,则会造成“指针悬挂”。所以new和delete后都要指向NULL。
   Char* pChar=new char[100]; //注意pChar在栈区,char[100]在堆区
   If(p!==NULL) //避免动态内存分配失败却又继续工作
8、类型转换:基本类型到类类型(构造函数实现),类类型到基本类型(类类型转换函数)。
9、异常处理:throw用来创建用户自定义类型的异常错误,用于抛出异常。Try标志程序中异常语句块的开始,用于引发异常。Catch标志异常错误处理模块的开始,用于捕获、处理异常。
10、命名空间:(系统)using namespace std;
       (自定义)namespace MynameSpace{} MynameSpace::…
       (别名)namespace N2=MynameSpace;


附录

以前整理的C++框架

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


总结

C++很值得深入学习,一起加油!!!
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C/C++】:C++总体回顾 的相关文章

随机推荐