C++自学考试知识框架笔记
2022-10-31 11:36:35 0 举报
AI智能生成
C++自学考试知识框架笔记
作者其他创作
大纲/内容
第一章 C++语言简介
C++语言的发展史
c++98仍是目前的主流标准
c++语言的特点
基本的输入\输出
头文件和命名空间
头文件
使用尖括号括住系统提供的头文件,使用双引号括住程序员自己定义的头文件
命名空间
使用关键字namespace把大量有逻辑联系的程序实体组合在一个标识符下
函数参数的默认值
默认值的形参必须在形参列表的最后
默认值的形参的右侧,不能出现无默认值的形参
引用和函数参数的传递
定义
引用相当于给变量起一个别名
注意
不能有空引用,即引用必须指向某个已存在的内存区域的首地址。也不能声明引用的引用。
不冷初始化常量
常引用
定义的前面加cost关键字,表明改引用是quot;常引用quot;
const与指针共同使用
const修饰指针变量的基本含义
内联函数
使用内联函数原因
调用函数时会带来程序运行时间上的开销,使用程序的执行效率降低
函数调用导致的时间开销可能会是程序运行明显变慢
函数的重载
指针和动态内存分配
使用new运算符指针动态分配内存
使用delete运算符释放动态分配内存
string处理字符串
第二章 面向对象的基本概念
概念和特点
4个特点
抽象
封装
继承
多态
创建类对象的基本形式
普通对象
类名 对象名
类名 对象名(参数)
类名 对象名 =nbsp; 类名(参数)
引用对象
类名 *对象指针名 = new 类名
类名 *对象指针名 = new 类名()
访问范围说明符
private
默认情况下类所有成员都是私有的
publice
protected
标识符的作用域与可见性
作用域类型
函数原型作用域
局部作用域
类作用域
命名空间作用域
可见性的一般原则
标识符要声明在前,引用在后
在同一个作用域中,不能声明同名的标识符,在没有互相包含关系的不同作用域中声明的同名标识符,互不影响
如果存在两个活多个具有包含关系的作用域,外层声明了一个标识符,而内层没有再次声明同名标识符,那么外层标识符在内层仍然可见。如果在内层声明了同名标识符,则外层标识符在内层不可见,这时称内层标识符隐藏了外层同名标识符,这种机制称为隐藏机制。
第三章 类和对象进阶
构造函数
作用
对对象进行初始化,C++提供了构造函数,用于对对象进行初始化,实际上是用来为成员变量赋初值的
定义
构造函数的函数名与类名相同
没有返回值
一个类的构造函数可以有多个,即构造函数允许重载
复制构造函数
是构造函数的一种,也称为了拷贝构造函数。复制构造函数只有一个参数,参数类型是本类的引用。一个类中可以写两个复制构造函数,一个函数的参数是const引用,另一个函数的参数是非const引用
作用
使用一个已存在的对象去初始化另一个正在创建的对象
自动调用复制构造函数的3种情况
当用一个对象去初始化本类的另一个对象时,会调用复制构造函数
如果函数F的参数是类A的对象,那么当调用F时,会调用类A的复制构造函数
如果函数的返回值是类A的对象,那么当函数返回时,会调用类A的复制构造函数
类型转换构造函数
如果构造函数只有一个采纳数,则可以看作是类型转换构造函数
析构函数
特点
类名前面加一个~字符,一区别于构造函数
析构函数没有参数,也没有返回值
一个类中仅有一个析构函数
作用
对象消亡时自动调用析构函数。析构函数的作用是做一些善后处理的工作
析构函数的调用执行顺序与构造函数相反
类的静态成员
静态变量
静态全局变量
静态局部变量
类的静态成员
静态成员变量
类定义中声明静态成员变量,然后必须在类体外定义静态成员变量的初值
类体外为静态成员变量赋初值时,前面不能加static关键字
静态成员函数
类体外定义成员函数时,前面不能加static关键字
类的静态成员函数没有this指针,不能在静态成员函数内访问非静态的成员,静态成员函数也不能调用非静态成员函数
变量及对象的生存期和作用域
变量生存期是指变量所占据的内存空间由分配到释放的时期
变量有效的范围称为其作用域
常量成员和常引用成员
常量成员
类的常量成员必须进行初始化,而且只能通过构造函数的成员初始化列表的方式进行
常量对象
常量对象只能调用常量函数
常量函数
常量函数内部不能修改常量成员变量的值,也不能修改非常量成员的值
成员对象和封闭类
成员对象
一个类的成员变量如果是另一个类的对象,则该成员变量称为“成员对象”
成员对象构造函数的执行次序与成员对象在类定义中的说明次序一致,与它们在构造函数初始化列表中出现的次序无关
封闭类对象消亡时,先执行封闭类的析构函数,然后执行成员对象的析构函数
封闭类
包含成员对象的类叫做封闭类
定义封闭类的构造函数时,需要添加初始化列表,指明要调用成员对象的哪个构造函数
友元
作用
类外函数打开一个特殊通道,授权它们能够访问本类的私有成员变量
友元函数
全局函数
其他类的成员函数
友元函数不是类的成员函数
友元类
this指针
友元函数不能通过对象调用,没有this指针
静态成员函数没有this指针
第四章 运算符重载
运算符重载的概念
目的
使得C++中的运算符也能够用来操作对象
不可重载的运算符和符号
.
.*,-gt;*
::
sizeof
?:
#
系统提供的默认重载版本
=系统默认重载为对象成员变量
系统默认重载为返回任何类对象的地址
二元运算符重载
定义为全局函数,需要为函数传递两个参数
定义为类的成员函数,只需传递一个参数
重载运算符为类的成员函数
重载运算符为友元函数
重载流插入运算符和流提取运算符
lt;lt;和cout一起用于输出,所以被称为流插入运算符
gt;gt;和cin一起用于输入,所以被称为流提取运算符
流是标志类库,用户程序只能继续不能修改,所以重载函数必须为类的友元
重载自增、自减运算符
重载为赋值运算符
要求左右两个操作数的类型是匹配的,或至少是赋值兼容的
C++规定=只能重载为成员函数
重载运算符的规则
重载后运算符的含义应该符合原有的用法习惯
运算符重载不能改变预算符原有的语义,包括运算符的优先级和结合性
运算符重载不能改变运算符操作数的个数以及语法结构
不能粗行间新的运算符
重载运算符()、[]、-gt;或者赋值运算符=,只能重载为成员函数,不能重载为全局函数
第五章 类的继承与派生
类的继承与类的派生
概念
通过已有的类建立新类的过程,叫作类的派生。原来的类称为基类,也成为了父类或一般类;新类称为派生类,也称为之类或特殊类
特点
使用基类派生新类时,除构造函数和析构函数外,基类的所有成员自动称为派生类的成员,包括基类的成员变量和成员函数
类的大小
使用sizeof()函数计算对象占用的字节数
空类的大小是1
继承关系的特殊性
如果基类有友元类或友元函数,则其派生类不会因继承关系而也有此友元类或友元函数
如果基类是某类的友元,则这种友元关系是被继承的。即被派生类集成过来的成员函数,如果原来是某类的友元函数,那么它作为派生类的成员函数仍是某类的友元函数
有继承关系的类之间的访问
派生类声明了一个和基类某个成员同名的形函数,派生的新成员就会隐藏了外层同名成员,直接使用成员名只能访问到派生类的成员
派生类声明了与基类成员函数同名的新函数,即使函数的参数表不同,从基类继承的同名函数的所有重载形式也被会隐藏
要访问被隐藏的成员,就需要使用基类名和作用域分辩符来限定
多重继承
一个派生类可以同时有多个基类,称为多重继承,一个基类派生一个类的情况,称为单继承或单重继承
访问控制
公有继承
基类的公有成员和保护成员的访问属性在派生类中不变,基类的私有成员在基类外不可直接访问
私有继承
基类中的公有成员和保护成员都已私有成员身份出现在派生类中
保护继承
基类中的公有成员和保护成员都以保护成员身份出现在派生类中
类型兼容
3条兼容规则
派生类的对象可以赋值给基类对象
派生类对象可以用来初始化基类引用
派生类对象的地址可以赋值给基类指针,即派生类的指针可以赋值给基类的指针
派生类对象作为基类对象使用时,只能使用从基类继承的成员
派生类的构造函数与析构函数
派生类对象在创建时,除了要调用自身的构造函数进行初始化,还要调用基类的构造函数初始化其包含的基类成员变量
先执行基类的构造函数。派生类对象消亡时,先执行派生类的析构函数,再执行基类的析构函数
派生类对象时,先执行各基类的构造函数,调用顺序为派生继承时的基类声明顺序
当创建多个基类的派生对象时,按照类定义中给出的基类的顺序,依次调用它们的构造函数,再调用派生类的构造函数。对象消亡时,按照构造函数调用的次序的逆,调用析构函数
类之间的关系
类和类之间的两种基本关系
继承关系
组合关系
封闭类的派生
先根据派生层次从上至下执行所有基类的构造函数,最后执行自身的构造函数。如果某个类是封闭类,则在执行本类构造函数之前,先按照成员对象的定义顺序执行各个成员对象所属类的构造函数
基类与派生类指针的互相转换
在公有派生的情况下,因为派生类对象也是基类对象,所以派生类对象可以赋给基类对象。
对于指针类型,可以使用基类指针指向派生类对象,也可以将派生类的指针直接赋值给基类指针。
派生类指针指向基类对象时,必须要将基类对象进行强制类型转换,才能赋给派生类指针
第六章 多态与虚函数
多态的基本概念
编译时多态
指函数的重载
运行时多态
继承、虚函数
多态是为了接口复用,不论传递过来的是哪个类的对象,函数都能够通过同一个接口调用到适应各自对象的实现方法
动态绑定的两个条件
必须声明虚函数
通过基类类型的引用或指针调用虚函数
虚函数
动态多态是通过继承加上虚函数共同实现
函数声明前加了virtual关键字的成员函数。virtual关键字只在类定义中的成员函数声明处使用,不能在类外部写成员函数体时使用
虚函数注意事项
虚函数一般不声明为内联函数
基类中定义了虚函数,在派生类中该函数始终保持虚函数的特性
静态成员函数和友元函数不能定义为虚函数
构造函数不能定义为虚函数
最好将基类的析构函数声明为虚函数
虚析构函数
如果一个基类指针指向的对象是用new运算符动态生成的派生类对象,那么释放该对象所占用的空间时,如果仅调用基类的析构函数,则只会完成该析构函数内的空间释放,不会涉及派生类的析构函数的空间释放
类的析构函数是虚函数,则由它派生的所有子类的析构函数也是虚析构函数。虚析构函数的目的是为了在对象消亡时实现多态。
纯虚函数和抽象类
纯虚函数
基类中的某个虚函数给不出一个确切的定义,或者没必要给出详细的定义,那么可以将它声明为一个纯虚函数。
纯虚函数只有函数的名字但不具备函数的功能,不能调用基类中的这个函数
抽象类
包含纯虚函数的类称为抽象类,抽象类中尚有未完成的函数定义,所以它不能实例化一个对象
没有给出全部纯虚函数的定义,派生类继续是抽象类,直到派生类中给出全部纯虚函数定义后才不是抽象类,才能实例化对象
不能创建抽象类的对象,但可以定义抽象类的指针和引用,这样的指针和引用也可以指向并访问派生类的成员
虚基类
多重继承允许从多个基类共同派生一个派生类,多重继承有天生的二义性,为了避免产生二义性,使用虚基类机制,仅保留一个版本
第七章 输入/输出流
ios是抽象基类,提供输入\输出所需的公共操作
标准流对象
iostream预定义了4个标准流对象
cin(标准输入流)
cout(标准输出流)
cerr(非缓冲错误输出流)
clog(缓冲错误输出流)
cerr和clog区别
cerr不使用缓冲区,直接向显示器输出信息
clog中的信息会被存储到缓冲区,缓冲区满或者刷新时才输出到屏幕
freopen
cout可以使用重定向函数freopen进行重定向,cerr不能
控制I/O格式
I/O格式控制的方式一般有使用流操作符、设置标志字和调用成员函数
流操作符
iostream
endl 输出一个新行符,并清空流,O
ends输出字符串结束,并清空流,O
dec 以十进制形式输入或输出整数,I/O
hex 以十六进制形式输入或输出整数,I/O
oct 以八进制形式输入或输出整数,I/O
iomanip
fixed以普通小数形式输出浮点数
scientific以科学计数法形式输出浮点数
left左对齐,宽度不足将填充字段添加到右边
right右对齐,宽度不足将填充字段添加到左边
setbase(int b)设置输出整数时的进制
setw(int w)指定输出宽度为w个字符或输入字符串时读取w个字符,一次有效
setfill(int c)指定输出宽度的情况下,输出的宽度不足时用ASCII码为c的字符填充,默认空格填充
setprecision(int n)设置输出浮点数的精度为n
setiosflags设置通用操纵符
resetiosflags清除通用操作符
boolapha把true和false输出为字符串
showpoint总是输出小数点
showpos在非负数值中显示+
internal数值的符号(正负号)在指定宽度内左对齐,数值右对齐,中间由填充字段填充
标志字
ios::left
ios::right
ios::internal
ios::oct
ios::hex
ios::showbase
ios::showpoint
ios::showpos
ios::scientific
ios::fixed
调用cout的成员函数
long setf(long 1Flags) 设置标志位
int width(int nw) 设置和返回输出宽度
char fill(char cFill) 设置填充字符
int precision(int np) 设置数据显示精度
ostream put(char c) 字符插入
ostream write(const char* pch,int nCount) 数据库插入
调用cin的成员函数
get函数
getline函数
eof函数
第八章 文件操作
打开和关闭文件
建立关联。通过指定文件名,建立起文件和文件流对象的关联
文件打开模式标记
打开文件
关闭文件
文件读写操作
读写文件
读写二进制
成员函数put和get读写文件
随机访问文件
第九章 函数模板与类模板
函数模板
类模板
类模板与继承
0 条评论
下一页