C++基础内容整理(适合学过一遍的人进行复习)

C++基础内容整理(适合学过一遍的人进行复习),第1张

面向对象基础易错回顾——star

这是我对面向对象程序设计这门课程知识的总结、凝练和升华。我想借这个总结的机会来体现我对于面向对象的这一概念的理解和体会并且提高我对面向对象知识的掌握程度。这是我自己根据面向对象课本的顺序总结的知识要点,每一点都需要记忆和理解,我整理出来,以便自己和大家复习和查看。

C++基础
  1. 内联函数:替换的方式提高执行效率,节约时空开销。当函数规模较小时使用。
  2. 带有默认参数的函数:(1)指定默认值的参数必须在未指定默认值参数的左侧;(2)函数声明和函数定义分开时,函数声明时指定默认值,定义时则不用指定默认值。
  3. 函数的重载:同名函数的参数的个数或类型不同构成函数重载。
  4. 作用域运算符:解决同名全局变量和局部变量的冲突问题。
  5. new和delete运算符:采用两种更安全的动态内存访问访问方式。new可以在申请内存时为单个简单变量赋初值。
  6. 引用:(1)声明时进行初始化,初始化后不能重新声明为另一个变量的引用;(2)引用做返回值可以放在赋值运算符的左侧接受值。
类和对象
  1. 结构体成员默认公有,类成员默认私有。
  2. 定义内联函数且其成员函数声明和定义分离时,inline关键字可以在声明处或定义处,也可以全部标明。
  3. 类声明中不可为数据成员赋初值。
  4. 若构造函数无参数,则在定义对象时,不带括号,否则难以区分是否是默认int类型的函数声明,导致出错。
  5. const和引用类型的数据成员只能使用成员初始化列表进行初始化。
  6. 数据成员按照他们在类中生命的顺序进行初始化。
  7. 当自定义了构造函数后,系统提供的默认的无参数的构造函数便会消失,故一般需要自定义无参数构造函数方便创建对象。
  8. 析构函数只能有一个且默认调用。
  9. 类类型是值类型,遵循值类型的传参方式。
  10. (1)调用拷贝构造函数的三种形式:赋值、传参、返回值;(2)拷贝构造函数的定义形式:类名::类名(const 类名&对象名){ }
  11. 静态数据成员:类成员的共有数据成员。(1)定义及初始化位于main函数之前,类声明之后;(2)格式:数据类型 类名::静态数据成员名 = 初始值 (不加static);
  12. 静态成员函数:一般情况下,用静态成员函数访问静态数据成员。(1)静态成员函数可以在对象建立前对静态数据成员进行处理。(2)静态成员函数没有this指针并且一般不访问其他数据成员。(3)同静态数据成员,类内声明加static,类外定义不加。
  13. 友元函数:(1)既可以是成员函数,也可以是非成员函数;(2)友元函数可以访问该类的所有成员(私有、保护、公有);(3)友元函数的声明可以放在任何访问属性的部分(私有、保护、公有);(4)定义也可以放在类内部和类外部;(5)类外定义友元函数时既不加friend关键字也不添加类名::(6)若想通过友元函数对类的数据成员进行访问,则需将对象的指针或者引用传入友元函数;(7)声明类的成员函数作为友元函数时需要加上成员函数所在类名。
  14. 友元类:(1)friend 类名,可以添加在类的任何部分(公有、私有、保护);(2)类的友元关系是单向的。
  15. 用初始化列表对对象成员进行初始化。
  16. 常引用做形参,不会对实参进行修改。
  17. 常对象:const 类名 对象名【(实参列表)】常对象的数据成员不能被修改。
  18. 常数据成员:只能通过初始化列表对数据成员进行初始化(初始化列表在定义时进行书写,声明时不书写,与默认参数函数相反)
  19. 常成员函数:类型说明符 函数名 (参数表)const;(const是函数的组成部分,所以定义声明时都要添加。)(1)常成员韩不可更新对象的数据成员的值但可以对任何变量进行访问。(2)普通成员函数可以访问常数据成员的值但是不可更改,但不可对常对象的数据成员进行访问。(常对象常等级最高)
派生类与继承
  1. 继承方式默认私有继承。
  2. 基类中若构造函数有参数,则派生类必须定义构造函数,通过成员初始化列表对基类的数据成员进行初始化。(类内声明不带初始化列表,类外定义时带)
  3. 构造函数执行顺序:基类——》对象成员——》派生类;析构函数与此相反。
  4. 可以用作用域标识符:基类::变量名or函数名(实参列表)对重定义的基类成员进行访问。
  5. 访问声明:可在私有继承时个别保持基类的某些公有成员和保护成员的访问属性——》把基类中的保护成员或者公有成员冠以基类名和作用域标识符写至私有派生类定义的同名段中。访问声明只含不带类型和参数的函数名(对基类中的所有重载函数起作用)或者变量名。
  6. 多重继承的继承方式是私有继承,即不显式的表明其它访问限定符,都默认为私有继承。
  7. 虚基类:(1)用于解决多个直接基类具有共同的基类的继承问题,使公共基类只产生一个复制。(2)格式:class 派生类名 :virtual 继承方式 基类名{}——》按照第一个继承的虚基类进行初始化和构造函数的调用。(3)若虚基类无法调用不带参数的构造函数,则所有直接或者间接的派生类,都必须在初始化列表上进行初始化。(4)如果构造的对象中有从虚基类继承来的成员,那么虚基类成员的初始化由而且只由最远派生类的构造函数调用虚基类的构造函数来完成。最远派生类就是声明对象时指定的类;(4)构造函数调用顺序为先虚基类后基类。
  8. 基类和派生类对象之间的赋值兼容关系:在任何需要基类对象的地方都可以用其公有派生类来代替(赋值、引用、指针、传参)。
多态性
  1. 运算符重载函数:(1)某些运算符无法重载(成员访问运算符【.】、成员指针访问运算符【.*】、作用域运算符【::】、长度运算符【Sizeof】、、条件运算符【?:】);(2)C++只能对已有运算符进行重载;(3)重载运算符无法改变 *** 作数的个数、不能改变优先级、不能改变结合性;(4)运算符重载函数的参数不能全部是C++标准类型。(5)运算符重载函数可以是普通函数、友元函数和成员函数。
  2. 友元运算符重载函数:返回值一般与所 *** 作的类的类型相同。
  3. 成员运算符重载函数:形参表中的参数作为右 *** 作数,左 *** 作数是该类当前对象(this指针隐式传递 return *this表示返回当前对象)
  4. 两者比较:不同数据类型一般用友元运算符重载函数(可重载交换参数位置);双目运算符一般采用友元运算符重载函数,单目运算符一般采用成员运算符重载函数。
  5. ++和—运算符的重载:一般用是否在参数表末尾加入int 区分是前缀还是后缀(有int为后缀 无int为前缀);友元运算符重载函数一般传入的是对象的引用以便在函数内部修改对象的内容。
  6. 赋值运算符重载函数:自定义赋值运算符重载函数用于解决指针悬挂问题。
  7. 下标运算符重载函数【】:【】是一个双目运算符,返回一个数据类型的引用可使其放在赋值运算符左侧。
  8. 类型转换:(1)A = B,B转换成A;(2)A + B 转换成A 、B中级别较高的类型。
  9. 转换构造函数(构造函数的一种):将一个其他类型的数据转换成它所在类的类型(仅有一个参数)。
  10. 类型转换函数(将一个类的对象转换成另一类型的数据):类中定义格式:(1)operator 目标类型(){函数体}=》函数名前不能指定其他数据类型,也不可有参数,但最后一条语句为返回目标类型的return语句;(2)调用格式:目标类型.(对象)=》只能定义为成员函数。
  11. 虚函数:基类对象指针指向派生类对象,则通过基类对象指针只能访问派生类从基类继承来的成员,用virtual关键字修饰的成员函数为虚函数(声明时加入,定义时不加)。(1)在派生类中重新定义时,函数原型必须与基类中完全一致(函数类型、函数名、参数个数、类型、顺序);(2)派生类中的同名函数自动成为虚函数,因此派生类中的virtual可省略;(3)如果派生类没有对虚函数进行重新定义,则公有派生类会持续继承虚函数,并保留虚函数特性;(4)虚函数必须是成员函数,因为要依靠特定对象决定激活哪个函数(5)可以让成员函数 *** 作一般化,用基类的指针指向不同的派生类的对象时,基类指针调用其虚成员函数,则会调用其真正指向对象的成员函数,而不是基类中定义的成员函数(只要派生类改写了该成员函数)。若不是虚函数,则不管基类指针指向的哪个派生类对象,调用时都会调用基类中定义的那个函数。
  12. 虚析构函数存在,但虚构造函数不存在。
  13. 纯虚函数和抽象类:用于为派生类保留一个名字做接口,该函数不能被调用,纯虚函数格式:virtual 函数类型 函数名(参数表) = 0,拥有纯虚函数的类称为抽象类,抽象类不可用于创建对象,只能用于指向其派生类;
模板
  1. 函数模板与模板函数:(1)允许使用多个类型参数,但每个类型参数都需要有typename关键字且用逗号间隔;(2)在templete语句和函数模板定义语句之间不应该有别的语句;(3)当调用函数时,首先寻找匹配的非模板函数,然后再寻找模板函数;
  2. 类模板和模板类:(1)类模板定义对象格式:类模板名<实际类型名>对象名(实参列表);(2)当成员函数进行类内声明后,进行类外定义时,若成员函数具有模板参数,则需要进行模板声明,而且还需要在成员函数名前缀上<类型参数>;
异常处理
  1. 运行中出现的错误统称为异常
  2. C++的异常引发和异常处理分离,底层函数着重于处理实际任务减轻底层函数负担,大大提高运算效率。
  3. try(检查)-throw(抛出)-catch(捕捉)三部分组成了C++的异常处理机制。try、catch之后的大括号{}不可省略;catch小括号中的异常类型声明若使用三点删节号(…)则表示它可以捕捉任何异常信息;一旦抛出一个异常,而程序又不进行捕获的话,程序会结束进行;在某些情况下,throw语句后可不跟任何内容,此时它将当前正在处理的异常信息再次抛出。
C++的流类库及其输入输出
  1. 从流中提取数据=》输入和提取 *** 作
  2. 向流中添加数据=》输出和插入 *** 作
  3. 常用流类:iostream、fstream、strstream、iomanip
  4. 常用流对象:cin、cout、cerr、clog
  5. endl含义:end of line
  6. istream和ostream包含在头文件iostream中
  7. 常用输入输出函数:

        cout.put(ch)函数=》输出一个字符(还可以是字符的ASCII码);

        cin.get(ch)函数=》读取一个字符,可读取空白符,读取成功即返回非零值,读取失败返    回零值(while(cin.get(ch));用于读取多个字符,输入回车时结束读取);

  1. 预定义类型的输入输出:

输入:可将多个不同类型的数据一起输入;

输出:(1)系统根据变量的类型来分隔输入的数据;(2)可用空白符或换行符进行数据的分隔;

  1. 格式控制:

第一种:流成员函数:

   流对象.set(flags)和流对象.unset(flags):可设置状态,设置后需用unsetf终止后再改用其它状态;可用运算符“|”设置多个状态。

     常用flag:

ios::skipws(跳过空白符)

ios::left(数据左对齐,默认右对齐)

ios::right(数据右对齐)

ios::internal(数据右对齐,符号左对齐)

ios::dec(dicimal十进制)

ios::hec(hexadecimal十六进制)

ios::oct(octal八进制)

ios::bin(binary二进制)

ios::shoubase(显示进制符号o或ox)

ios::showlower(十六进制字母或者科学计数法中

字母小写显示)

Ios::showupper(十六进制或者科学计数法中的

字母大写显示)

Ios::scientific(浮点数科学计数法形式显示)

Ios::shouos(正数前显示正号)

流对象.width(n):设置域宽;仅仅对先一个输出起作用

流对象.fill(ch):设置填充符;

流对象.pricision(n):设置实数精度fill和pricision函数在整个程序内有效。

第二种:预定义 *** 作符:

不带参数的 *** 作符定义在头文件iostream中;带参数

的 *** 作符则定义在头文件iomanip中。

         常用的不带参数的 *** 作符:dec,oct,hex,endl,ws(用于在输入输出时跳过开头的空白符)flush(刷新输出流,把缓冲区数据强制输出)

         常用的带参数的 *** 作符:

setbase(n):设置基数,n = 2 8 10 16;

setpricision(n):设置实数精度;

setiosflags()和unsetiosflags():参数参考以上流成员函数常用flag;

  1. 用户自定义数据类型的输入输出:格式如下:

ostream& operator<<(ostream & out,TypeName& objName){

out<

out<

return out;

}

需注意将自定义输入输出函数设为友元函数,才可以对成员进行访问;

  1. 命名空间

命名空间定义格式:namespace Name{

数据类型 变量名 = 变量值;

}

  1. 头文件:带后缀.h的不需要using命名空间,不带后缀.h的头文件需要using命名空间。C++推荐使用不带后缀的头文件。
  2. 文件:存放在外部介质的数据集合。 *** 作系统以文件为单位对数据进行管理。文件分为文本文件和二进制文件。文件的输入输出需要一个流对象与文件相关联。三个文件流类:fstream、ofstream、ifstream。
  3. 文件的打开(关联):

文件流类 文件流对象

文件流对象.open(文件名,打开方式)

文件流类 文件流对象(对象名,打开方式)

  1. 文件的关闭(取消关联):

文件流对象.close()

文件默认为当前目录下的文件,默认以文本文件的形式打开文件,默认打开文件在文件不存在的情况下创建新文件。

打开方式:

Ios::app:追加

ios::in:提取(输入)

ios::out:插入(输出)

ios::nocreate:不建立新文件

ios::noreplace:不打开旧文件

ios::binary:以二进制方式打开文件

ios::trunc:清空文件内容并打开文件

易错
  1. 在定义自定义运算符输入输出函数对自定义的对象进行输入输出时,却没有将函数声明为类的友元函数,导致自定义输入输出函数没有办法访问类的数据成员。
  2. 在进行参数传递时,仅仅是采用值传递,将对象传入到函数中,却无法对外部对象进行修改,采用了引用传递和设为全局变量的方式进行了解决。
  3. 自学异常处理语句和文件的输入输出时,因为不细心,导致在打开和关闭文件时总是采用覆盖方式打开,每次运行程序,文件中的内容都消失了。之后经过查询资料才明白ios::app是append的简写,是追加的意思,需要用这种方式对文件进行打开。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/914777.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存