文章目录
基础部分
一、初识c++
- 程序的注释://单行注释
/* 多行注释*/ - 变量
变量的作用:给一段指定的内存空间起名,方便操作这段内存
语法:数据类型 变量名=初始值; - 常量
作用: 用于记录程序中不可更改的数据
c++定义常量的两种方式:- #define 宏常量 :define 常量名 常量值 //通常在文件上方定义,表示一个常量
- const 修饰的变量: const 数据类型 常量名=常量值;//通常在变量定义前加关键字const,修饰该变量为常量,不可修改
- 关键字
作用:关键字是c++中预先保留的单词(标识符)
在定义变量或者常量时候,不要用关键字
5. 标识符命名规则
作用:c++规定给标识符(变量、常量)命名时,有一套自己的规则
标识符不是关键字
标识符只能由字母、数字、下划线组成
第一个字符必须为字母或下划线
标识符中字母区分大小写
建议:给标识符命名时,争取做到视名知意的效果,方便自己和他人的阅读
二、数据类型
- 整形
c++规定在创建一个变量或者常量时,必须要指定出相应的数据类型,否则无法给变量分配内存
- sizeof关键字
作用:利用sizeof关键字可以统计数据类型所占内存大小
语法:sizeof(数据类型 / 变量) - 浮点型
作用:用于表示小数
浮点型变量分为两种:
1.单精度float
2.双精度double
float f=3.14f;//后加f,否则默认为double类型
double d=3.14;
-
字符型
作用:字符型变量用于显示单个字符
语法:char ch='a'
;
注意1: 在显示字符型变量时,用单引号将字符括起来,不要用双引号
注意2:单引号内只能有一个字符,不可以是字符串
c和c++中字符型变量只占用1个字节
字符型变量并不是把字符本身放到内存中存储,而是将对应的ASCLL编码放入到存储单元 -
转义字符
作用:用于表示一些不能显示出来的ASCLL字符
现阶段我们常用的转义字符有:\n \\ \t
-
字符串型
作用:用于表示一串字符
两种风格:
c风格字符串:char 变量名[]="字符串值"
;
char str1[]="hello world"
;
c++风格字符串:string 变量名=“字符串值”
; -
布尔类型
作用:布尔数据类型代表真或假的值
bool类型只有两个值:
true----真
false----假
三、运算符
作用:用于执行代码的运算
-
算数运算符
作用:用于处理四则运算
-
赋值运算符
作用:用于将表达式的值赋给变量 -
比较运算符
作用:用于表达式的比较,并返回一个真值或假值
-
逻辑运算符
作用:用于根据表达式的值返回真值或假值
四、程序流程结构
c/c++支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构
·顺序结构:程序按顺序执行,不发生跳转
· 选择结构:依据条件是否满足,有选择的执行相应功能
·循环结构:依据条件是否满足,循环多次执行某段代码
-
选择结构
1) if语句
1.单行格式 : if(条件){ 条件满足执行的语句};
2.多行格式: if(条件){条件满足执行的语句} else{条件不满足执行的语句};
3.多条件的if语句: if(条件1){条件1满足执行的语句} else if (条件2){条件2满足执行的语句}… else{都不满足执行的语句};
4.嵌套if语句
2)三目运算符
作用:通过三目运算符实现简单的判断
语法:表达式1?表达式2:表达式33)switch语句
作用:执行多条件分支语句
-
循环结构
1)while循环语句
作用:满足循环条件,执行循环语句
语法:while (循环条件){循环语句} //break退出循环2)do…while 循环语句
作用:满足循环条件,执行循环语句
语法:do{循环语句}while(循环条件);
注意:与while的区别在于do…while会先执行一次循环语句,在判断循环条件
3)for 循环语句
作用:满足循环条件,执行循环语句
语法:for(起始表达式;条件表达式;末尾循环) {循环语句;}
4)嵌套循环
作用:在循环体中再嵌套一层循环,解决一些实际问题 -
跳转语句
1)break
作用:用于跳出选择结构或者循环结构
2)continue语句
作用:在循环语句中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环
3)goto 语句
作用:可以无条件跳转语句
语法:goto 标记;
解释:如果标记的名称存在,执行到goto语句时,会跳转到标记的位置
goto FLAG;
....
FLAG:
.....
五、数组
-
概述
所谓数组,就是一个集合,里面存放了相同类型的数据元素 -
一维数组
1)
2)一维数组数组名
//数组名就是数组的首地址,列:arr[]={…};int *p=arr;
-
二维数组
二维数组就是在一维数组上,多加一个维度
1)
2)二维数组名
六、函数
- 概述
作用:将一段经常使用的代码封装起来,减少重复代码
一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能。 - 函数的定义
函数的定义一般主要有5个步骤:
1).返回值类型
2).函数名
3).函数表列
4).函数体语句
5).return表达式
语法:
返回值类型 函数名 (参数列表)
{
函数体语句
return 表达式
}
- 函数的调用
功能:使用定义好的函数
语法:函数名(参数) - 函数的常见样式
常见样式有4种
1)无参无返
2)有参无返
3)无参有返
4)有参有返 - 函数的声明
作用:告诉编译器函数名称及如何调用函数,函数的实际主体可以单独定义。
·函数的声明可以多次,但是函数的定义只能有一次 - 函数的分文件编写
作用:让代码结构更加清晰
函数分文件编写一般有4个步骤
1)创建后缀名为.h的头文件
2)创建后缀名为.cpp的源文件
3)在头文件中写函数的声明
4)在源文件中写函数的定义
七、指针
-
指针的基本概念
指针的作用:可以通过指针间接访问内存
·内存编号是从0开始记录的,一般用十六进制数字表示
·可以利用指针变量保存地址 -
指针变量的定义和使用
指针变量定义语法:数据类型 * 变量名
//指针前加* 代表解引用,找到指针指向的内存中的数据
//可以通过解引用的方式来找到指针指向的内存 -
指针所占内存空间大小
在32位操作系统下,指针是占4个字节空间大小,不管是什么数据类型
在64位操作系统下,指针是占8个字节空间大小,不管是什么数据类型 -
空指针和野指针
1)空指针:指针变量指向内存中编号为0的空间
用途:初始化指针变量
注意:空指针指向的内存是不可以访问的
2)野指针:指针变量指向非法的内存空间总结:空指针和野指针都不是我们申请的空间,因此不要访问
-
const 修饰指针
const修饰指针有三种情况:
1)const修饰指针----常量指针
const int *p=&a;
//特点:指针的指向可以修改,但是指针指向的值不可以修改
2)const修饰常量----指针常量
int * const p =&a;
//特点:指针的指向不可以改,指针指向的值可以改
3)const既修饰指针,又修饰常量
const int * const p =&a;
//特点:指针的指向和指针指向的值都不可以改 -
指针和数组
作用:利用指针访问数组中元素 -
指针和函数
作用:利用指针作函数参数,可以修改实参的值
八、结构体
- 结构体基本概念
结构体属于用户自定义的数据类型,允许用户存储不同的数据类型 - 结构体定义和使用
语法:struct 结构体名 {结构体成员列表};
通过结构体创建变量的方式有三种:
1)struct 结构体名 变量名
2)struct 结构体名 变量名={成员1值,成员2值…}
3)定义结构体时顺便创建变量 - 结构体数组
作用:将自定义的结构体放入到数组中方便维护
语法:struct 结构体名 数组名{元素个数}={{},{}…{}} - 结构体指针
作用:通过指针访问结构体中的成员
·利用操作符->可以通过结构体指针访问结构体属性 - 结构体嵌套结构体
作用:结构体中的成员可以是另一个结构体 - 结构体做函数参数
作用:将结构体作为参数向函数中传递
传递方式有两种:
·值传递
`地址传递
c++核心编程
一、
- 内存分区模型
代码区
全局区
栈区
堆区 - new运算符
语法:new 数据类型
利用new创建的数据,会返回该数据类型的指针
二、引用
- 引用的基本使用
作用:给变量起别名
语法:数据类型 &别名=原名
- 引用注意事项
·引用必须初始化
·引用在初始化后,不可以改变 - 引用做函数参数
作用:函数传参时,可以利用引用的技术让形参修饰实参
优点:可以简化指针修改实参 - 引用做函数返回值
作用:引用是可以作为函数的返回值存在的
注意:不要返回局部变量引用
用法:函数调用作为左值 - 引用的本质
本质:引用的本质在c++内部实现是一个指针常量 - 常量引用
作用:常量引用主要用来修饰形参,防止误操作
在函数形参列表中,可以加const修饰形参,防止形参改变实参
三、函数提高
- 函数默认参数
在c++中,函数的形参列表中的形参是可以有默认值的
语法:
返回值类型 函数名 (参数=默认值){}
//如果我们自己传入数据,就用自己的数据,如果没有,那么就用默认值
//如果某个位置已经有了默认参数,那么从这个位置往后,从左
到右都必须有默认值
2. 函数占位参数
c++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补改位置
语法:返回值类型 函数名 (数据类型){}
-
函数重载
(1).函数重载概述
作用:函数名可以相同,提高复用性
函数重载满足条件:
·同一个作用域下
·函数名称相同
·函数参数类型不同 或者个数不同 或者顺序不同
注意:函数的返回值不可以作为函数重载的条件(2).函数重载注意事项
·引用作为重载条件
·函数重载碰到函数默认参数
四、类和对象
c++面向对象的三大特性为:封装、继承、多态
c++认为万事万物都皆有对象,对象上有其属性和行为
- 封装
语法:class 类名 { 访问权限: 属性/行为 };
访问权限:
public公共权限、 成员 类内可以访问 类外可以访问
protected保护权限、成员 类内可以访问 类外不可以访问 儿子可以访问父亲中的保护内容
private私有权限 成员 类内可以访问 类外不可以访问 儿子不可以访问父亲的私有内容
(2)struct和class区别
在c++中struct和class唯一区别就是默认的访问权限不同
区别:
·struct默认权限为公共
·class默认权限为私有
(3)成员属性设置为私有
优点1:将所有成员属性设置为私有,可以自己控制读写权限
优点2:对于写权限,我们可以检测数据的有效性
2. 对象的初始化和清理
(1)构造函数和析构函数
构造函数语法:类名(){}
析构函数语法:~类名(){}
(2)构造函数的分类及调用
两种分类方式:
按参数分为:有参构造和无参构造
按类型分为:普通构造和拷贝构造
三种调用方式:
括号法
显示法
隐式转换法
(3)拷贝构造函数调用时机
(4)构造函数调用规则
默认情况下,c++编译器至少给一个类添加3个函数
·默认构造函数(无参,函数体为空)
·默认析构函数(无参,函数体为空)
·默认拷贝构造函数(函数,对属性进行值拷贝)
构造函数调用规则如下:
·如果用户自定义有参构造函数,c++不在提供默认无参构造,但是会提供默认拷贝构造
·如果用户自定义拷贝构造函数,c++不会再提供其他构造函数
(5)深拷贝与浅拷贝
浅拷贝:简单的赋值拷贝操作
深拷贝:在堆区重新申请空间,进行拷贝操作
(6)初始化列表
作用:c++提供了初始化列表语法,用来初始化属性
语法:构造函数():属性1(值1),属性2(值2)…{}
(7)类对象作为类成员
//当其他类对象作为本类成员,构造时候先构造其他类对象,再构造自身
//析构顺序与构造顺序相反
(8)静态成员
静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员
静态成员分为:
静态成员变量
·所有对象共享同一份数据
·在编译阶段分配内存
·类内声明,类外初始化
静态成员函数
·所有对象共享同一个函数
·静态成员函数只能访问静态成员变量
- c++对象模型和this指针
(1)成员变量和成员函数分开存储
在c++中,类内的成员变量和成员函数分开存储
只有非静态成员变量才属于类的对象上
(2)this指针概念
c++通过提供特殊的对象指针,this指针,解决上述问题。
//this指针 指向 被调用的成员函数 所属的 对象
//this指针是隐含每一个非静态成员函数内的一种指针
//this指针不需要定义,直接使用即可
(3)空指针访问成员函数
c++中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针
如果用到this指针,需要加以判断保证代码的健壮性
(4)const修饰成员函数
常函数:
·成员函数后加const后我们称这个函数为常函数
·常函数内不可以修改成员属性
·成员属性声明时加关键字mutable后,在常函数中依然可以修改
常对象:
声明对象前加const称该对象为常对象
·常对象只能调用常函数
-
友元
友元的三种实现
·全局函数做友元
·类做友元
·成员函数做友元 -
运算符重载
(1)加号运算符重载
作用:实现两个自定义数据类型相加的运算
(2)左移
(3)递增
(4)赋值
(5)关系运算符
(6)函数调用 (仿函数 ) -
继承
继承是面向对象的三大特性之一
继承的好处:可以减少重复的代码
class A: public B
{
}
A类称为子类 或 派生类
B类称为父类 或 基类
派生类中的成员,包含两大部分
一类是从基类继承过来的,一类是自己增加的成员
从基类继承过来的表现其共性,而新增的成员体现了其个性
(2)继承方式
继承的语法: class 子类:继承方式 父类
继承方式一共有三种:
·公共继承
·保护继承
·私有继承
(3)继承中的对象模型
(4)继承中构造和析构顺序
子类继承父类后,当创建子类对象,也会调用父类的构造函数
继承中 先调用父类构造函数,再调用子类构造函数,析构顺序与构造函数相反
(5)继承同名成员处理方式
·访问子类同名成员,直接访问即可
·访问父类同名成员,需要加作用域
(6)继承同名静态成员处理方式
同上
·访问子类同名成员,直接访问即可
·访问父类同名成员,需要加作用域
(7)多继承语法
c++允许一个类继承多个类
语法:class 子类: 继承方式 父类1,继承方式 父类2…
多继承可能会引发父类中有同名成员出现,需要加作用域区分
7. 多态
多态的概念
多态是c++面向对象三大特性之一
多态分为两类
·静态多态:函数重载和运算符重载属于静态多态,复用函数名
·动态多态:派生类和虚函数实现运行时多态
静态多态和动态多态区别:
·静态多态的函数地址早绑定-编译阶段确定函数地址
·动态多态的函数地址晚绑定-运行阶段确定函数地址
多态满足条件
·有继承关系
·子类重写父类中的虚函数
多态使用条件
·父类指针或引用指向子类对象
重写:函数返回值类型 函数名 参数列表 完全一致称为重写
(2)多态的优点
代码组织结构清晰
可读性强
利于前期和后期的扩展以及维护
(3)纯虚函数和抽象类
在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容
因此可以将虚函数改为纯虚函数
纯虚函数语法:virtual 返回值类型 函数名 (参数列表)=0;
当类中有了纯虚函数,这个类也称为抽象类
抽象类特点:
·无法实例化对象
·子类必须重写抽象类中的纯虚函数,否则也属于抽象类
(4)虚析构和纯虚析构
解决方式:将父类中的析构函数改为虚析构或者纯虚析构
虚析构和纯虚析构共性:
·可以解决父类指针释放子类对象
·都需要有具体的函数实现
虚析构和纯虚析构区别:
·如果是纯虚析构,改类属于抽象类,无法实例化对象
虚析构语法:
virtual ~类名(){}
纯虚析构语法:
virtual ~类名 ()=0;
类名::~类名(){}
五、文件操作
程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放
通过文件可以将数据持久化
c++中对文件操作需要包含头文件<fstream>
文件类型分为两种:
- 文本文件 -文件以文本的ascll码形式存储在计算机中
- 二进制文件 -文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂他们
操作文件的三大类:
1.fstream:写操作
2.ifstream:读操作
3.fstream:读写操作
读文件:
(2)二进制文件
以二进制方式对文件进行读写操作
打开方式要指定为 ios::binary
c++提高编程
本阶段主要针对c++泛型编程和STL技术做详细讲解,探讨c++更深层的使用
一、模板
- 模板的概念
模板就是建立通用的模具,大大提高复用性
模板的特点:
·模板不可以直接使用,它只是一个框架
·模板的通用并不是万能的 - 函数模板
·c++另一种编程思想称为泛型编程,主要利用的技术就是模板
·c++提供两种模板机制:函数模板和类模板
(1)函数模板语法
函数模板作用:
建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表
语法:
template<typename T>
函数声明或定义
(3)
使用模板时必须确定出通用数据类型T,并且能够推导出一致的类型
3. 类模板
作用:建立一个通用类,类中的成员 数据类型可以不具体制定,用一个虚拟的类型来代表
语法:
template <typename T>
类
- 类模板与继承
- 类模板成员函数类外实现
- 类模板与友元
二、STL
-
STL概念
STL(standard template library,标准模板库)
STL从广义上分为:容器 (container) 算法(algorithm) 迭代器(iterator)
容器和算法之间通过迭代器进行无缝连接
STL几乎所有的代码都采用了模板类或者模板函数 -
STL常用容器
(1)string容器
本质:string是c++风格的字符串,而string本质上是一个类
string和char区别:
·char是一个指针
·string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器
特点:string类内部封装了很多成员方法
(2)vector容器
(3)deque容器
(4)stack容器
(5)queue容器
(6)list容器
(7)set容器
(8)map容器 -
STL函数对象
-
STL常用算法