注释:
1.单行注释 //注释
2.多行注释 /*注释*/
main是一个程序的入口,每个程序都必须有这么一个函数,有且仅有一个。
变量创建的语法:
数据类型 变量名 = 变量初始值;
int a = 10;
常量:
作用:用于记录程序中不可更改的数据
C++定义常量两种方式
1.#define宏常量:
通常在文件上方定义,表示一个常量
2.const修饰的变量
通常是在变量定义前加关键字const,修饰该变量为常量,不可修改
关键字:
作用:关键字是C++中预先保留的单词(标识符)
#在定义变量或者常量时候,不要用关键字
标识符命名规则:
作用:C++规定给标识符(变量、常量)命名时,有一套自己的规则
#标识符不能是关键字
#标识符只能由字母、数字、下划线组成
#第一个字符必须是字母或下划线
#标识符中字母区分大小写
建议:给标识符命名时,争取做到见名知意的效果,方便自己和他人的阅读
数据类型:
C++规定在创建一个变量或者常量时,必须要指定出相应的数据类型,否则无法给变量分配内存
整型:整型变量表示的是整数类型的数据
C++中能够表示整型的类型有以下几种方式,区别在于所占内存空间不同:
short (2字节)
int (4字节)
long (4字节)
long long (8字节)
sizeof关键字:
作用:利用sizeof关键字可以统计数据类型所占内存大小
语法:sizeof( 数据类型 / 变量 )
实型(浮点型)
作用:用于表示小数
浮点型变量分为两种:
1.单精度float
2.双精度double
#默认情况下,输出一个小数,会显示出6位有效数字
字符型:
作用:字符型变量用于显示单个字符
语法:char ch = ‘a’;
注意1:在显示字符型变量时,用单引号将字符括起来,不要用双引号
注意2:单引号内只能有一个字符,不可以是字符串
#创建字符型变量时候,要用单引号
#创建字符型变量时候,单引号内只能有一个字符
1.C和C++字符型变量只占用1个字节
2.字符型变量并不是字符本身放到内存中存储,而是将对应的ASCII编码放入到存储单元
转义字符:
作用:用于表示一些不能显示出来的ASCII字符
\n:换行(LF),将当前位置移到下一行开头
\t:水平制表(HT) (跳到下一个TAB位置)
\\:代表一个反斜线字符“\"
字符串型:
作用:用于表示一串字符
两种风格:
1.C风格字符串:char变量名【】=”字符串值“
1.C++风格字符串:string变量名=”字符串值“
#include <string> //用C++风格字符串时候,要包含这个头文件
布尔类型bool:
作用:布尔数据类型代表真或假的值
bool类型只有两个值:
true — 真(本质是1)
false — 假(本质是0)
bool类型占1个字节大小
数据的输入:
作用:用于从键盘获取数据
关键字:cin
语法: cin >> 变量
算术运算符:
作用:用于处理四则运算
#两个整数相除,结果依然是整数,将小数部分去除
#两个数相除,除数是不可以为0的
#两个小数可以相除
#运算的结果也可以是小数
#取模运算本质,就是求余数(a%b)
#两个数相除除数不可以为0,所以也做不了取模运算
#两个小数是不可以做取模运算的
总结:只有整型变量可以进行取模运算
前置递增与后置递增的区别:
前置递增:先让变量+1,然后进行表达式运算;
后置递增:先进行表达式运算,后让变量+1;
赋值运算符:
作用:用于将表达式的值赋给变量
赋值运算符包括以下几个符号:
=(赋值)
+=(加等于)
-=(减等于)
*=(乘等于)
/=(除等于)
%=(模等于)
比较运算符:
作用:用于表达式的比较,并返回一个真值或假值
比较运算符有以下符号:
==(相等于)
!=(不等于)
<(小于)
>(大于)
<=(小于等于)
>=(大于等于)
逻辑运算符:
作用:用于根据表达式的值返回真值或假值
逻辑运算符有一下符号:
! 术语(非) 示例(!a) 结果(如果a为假,则!a为真;如果a为真,则!a为假。)
&& 术语(与) 示例(a&&b)结果(如果a和b都为真,则结果为真,否则为假。)
|| 术语(或) 示例(a||b) 结果(如果a和b有一个为真,二者都为假时,结果为假。)
程序流程结构:
C/C++支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构
1.顺序结构:程序按顺序执行,不发生跳转
2.选择结构:依依据条件是否满足,有选择的执行相应功能
3.循环结构:依据条件是否满足,循环多次执行某段代码
选择结构:
if语句:
作用:执行满足条件的语气
if语句的三种形式:
1.单行格式if语句
2.多行格式if语句
3.多条件的if语句
1.单行格式if语句:if(条件){条件满足执行的语句}
#if条件后面不用加分号
2.多行格式if语句:if(条件){条件满足执行的语句}else{条件不满足执行的语句}
3.多条件的if语句:if(条件1){条件1满足执行的语句}else if(条件2){条件2满足执行的语句}…else{都不满足执行的语句}
嵌套if语句:
在if语句中,可以嵌套使用if语句,达到更精确的条件判断
三目运算符:
作用:通过三目运算符实现简单的判断
语法:
表达式1 ?表达式2 : 表达式3
解释:
如果表达式1的值为真,执行表达式2,并返回表达式2的结果;
如果表达式1的值为假,执行表达式3,并返回表达式3的结果。
switch语句:
作用:
执行多条件分支语气
switch(表达式)
{
case 结果1:执行语句;break;
case 结果2:执行语句;break;
if 和 switch区别:
switch 缺点:判断时候只能是整型或者字符型,不可以是一个区间;
switch 优点:结构清晰,执行效率高;
循环结构:
while循环语句;
作用:满足循环条件,执行循环语句
语法:while(循环条件){循环语句}
解释:只要循环条件的结果为真,就执行循环语句
……
default:执行语句;break;
}
注意:在执行循环语句时候,程序必须提供跳出循环的出口,否则出现死循环
break:可以利用该关键字来退出当前循环
srand((unsigned int)time(NULL)); //添加随机数种子,作用是利用当前系统时间生成随机数,防止每次随机数都一样
#include<ctime> //time系统时间头文件
do…while循环语句:
作用:满足循环条件,执行循环语句
语法:do{ 循环语句 } while(循环条件);
总结:与while的区别在于do…while会先执行一次循环语句,再判断循环条件
for循环语句:
作用:满足循环条件,执行循环语句
语法:for(起始表达式;条件表达式;末尾循环体){ 循环语句;}
注意:for循环中的表达式,要用分号进行分隔
总结:while,do…while,for都是开发中常见的循环语句,for循环结构比较清晰,比较常用
跳转语句:
break语句:
作用:用于跳出选择结构或者循环结构
break使用的时机:
1.出现在switch条件语句中,作用是终止case并跳出switch
2.出现在循环语句中,作用是跳出当前的循环语句
3.出现在嵌套循环中,跳出最近的内层循环语句
continue 语句:
作用:在循环语句中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环
注意:continue并没有使整个循环终止,而break会跳出循环
goto 语句:
作用:可以无条件跳转语句
语法: goto 标记;
解释:如果标记的名称存在,执行到goto语句时,会跳转到标记的位置
注意:在程序中不建议使用goto语句,以免造成程序流程混乱
数组:
概述:所谓数组,就是一个集合,里面存放了相同类型的数据元素
特点1:数组中的每个数据元素都是相同的数据类型
特点2:数组是由连续的内存位置组成的
一堆数组:
一堆数组定义方式:
一维数组定义的三种方式:
1.数据类型 数组名【 数组长度 】;
2.数据类型 数组名【 数组长度 】= { 值1,值2 …};
3.数据类型 数组名【 】 = { 值1,值2 …};
数组特点:放在一块连续的内存空间中,数组中每个元素都是相同数据类型
下标:我们可以通过下标访问数组中的元素
总结1:数组名的命名规范与变量名命名规范一致,不要和变量重名
总结2:数组中下标是从0开始索引
一维数组数组名:
一维数组名称的用途:
1.可以统计整个数组在内存中的长度
2.可以获取数组在内存中的首地址
冒泡排序:
作用:最常用的排序算法,对数组内元素进行排序
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素做同样的工作,执行完毕后,找到一个最大值。
3.重复以上的步骤,每次比较次数-1,直到不需要比较。
二维数组:
二维数组就是在一堆数组上,多加一个维度。
二维数组定义方式:
二维数组定义的四种方式:
1.数据类型 数组名【 行数 】【 列数 】;
2.数据类型 数组名【 行数 】【 列数 】 = { {数据1,数据2 } , {数据3,数据4} };
3.数据类型 数组名【 行数 】【 列数 】 = { 数据1,数据2,数据3,数据4 };
4.数据类型 数组名【 】【 列数 】 = { 数据1,数据2,数据3,数据4 };
建议:以上4种定义方式,利用第二种更加直观,提高代码的可读性
总结:在定义二维数组时,如果初始化了数据,可以省略行数
二维数组数组名:
#查看二维数组所占内存空间
#获取二维数组首地址
&:取址符
函数:
概述:
作用:将一段经常使用的代码封装起来,减少重复代码;
一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能;
函数的定义:
函数的定义一般主要有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个字节空间大小;
空指针和野指针:
空指针:指针变量指向内存中编号为0的空间
用途:初始化指针变量
注意:空指针指向的内存是不可以访问的
野指针:指针变量指向非法的内存空间
总结:空指针和野指针都不是我们申请的空间,因此不要访问。
const 修饰指针:
const 修饰指针有三种情况:
1.const 修饰指针……常量指针
#const 修饰的是指针,指针指向可以改,指针指向的值不可以更改
2.cosnt 修饰常量……指针常量
#const 修饰的是常量,指针指向不可以改,指针指向的值可以更改
3.const 即修饰指针,又修饰常量
#const 既修饰指针又修饰常量
技巧:看const 右侧紧跟着的是指针还是常量,,是指针就是常量指针,是常量就是指针常量
指针和数组:
作用:利用指针访问数组中元素
指针和函数:
作用:利用指针作函数参数,可以修改实参的值
总结:如果不想修改实参,就用值传递,如果想修改实参,就用地址传递
结构体:
结构体基本概念:
结构体属于用户自定义的数据类型,允许用户存储不同的数据类型
结构体定义和使用:
语法:struct 结构体名 { 结构体成员列表 };
通过结构体创建变量的方式有三种:
#struct 结构体名 变量名
#struct 结构体名 变量名={成员1值,成员2值…}
#定义结构体是顺便创建变量
总结1:定义结构体时的关键字是struct,不可省略;
总结2:创建结构体变量时,关键字struct可以省略;
总结3:结构体变量利用操作符“.”访问成员;
结构体数组:
作用:将自定义的结构体放入到数组中方便维护
语法:struct 结构体名 数组名 [元素个数] = { { } , { } ,… { } };
结构体指针:
作用:通过指针访问结构体中的成员
#利用 -> 操作符可以通过结构体指针访问结构体属性
结构体嵌套结构体:
作用:结构体中的成员可以是另一个结构体
例如:每个老师辅导一个学员,一个老师的结构体中,记录一个学生的结构体
总结:在结构体中可以定义另一个结构体作为成员,用来解决实际问题
结构体做函数参数:
作用:将结构体作为参数向函数中传递
传递方式有两种:
#值传递
#地址传递
总结:如果不想修改主函数中的数据,用值传递,反之用地址传递
结构体中const使用场景:
作用:用const来防止误操作
总结:
#将函数中的形参改为指针,可以减少内存空间,而且不会复制新的副本出来;
#加入const之后,一旦有修改的操作就会报错,可以防止我们的误操作
随机数代码:int random = rand()% 数值 + 数值;
随机数种子:
头文件:#include <ctime>
代码:srand ( ( unsigned int ) time ( NULL ) ) ;
system(”pause“); //按任意键下一步;
system(”cls“); //清屏;
内存分区模型:
C++程序在执行时,将内存大方向划分为4个区域:
#代码区:存放函数体的二进制代码,由操作系统进行管理的;
#全局区:存放全局变量和静态变量以及常量;
#栈区:由编译器自动分配释放,存放函数的参数值等;
#堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收;
内存四区意义:
不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程
程序运行前:
在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域
代码区:
#存放CPU执行的机器指令;
#代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可;
#代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令;
全局区:
#全局变量和静态变量存放在此;
#全局区还包括了常量区,字符串常量和其他常量也存放在此;
#该区域的数据在程序结束后由操作系统释放;
总结:
#C++在程序运行前分为全局区和代码区;
#代码区特点是共享和只读;
#全局区中存放全局变量、静态变量、常量
#常量区中存放 const 修饰的全局变量 和 字符串变量;
全局区:
全局变量;
静态变量 static 关键字
常量 { 字符串常量、const 修饰的全局变量(全局常量)};
不在全局区中:
局部变量;
const 修饰的局部变量(局部常量);
程序运行后:
栈区:
由编译器自动分配释放,存放函数的参数值、局部变量等;
注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放;
堆区:
由程序员分配释放,若程序员不释放,程序结束时由操作系统回收;
在C++中主要利用new在堆区开辟内存;
总结:
#堆区数据由程序员管理开辟和释放;
#堆区数据利用new关键字进行开辟内存;
C++中利用new操作符在堆区开辟数据:
#堆区开辟得数据,由程序员手动开辟,手动释放,释放利用操作符delete;
语法:new 数据类型;
#利用new创建的数据,会返回该数据对应得类型得指针;
#释放数组的时候,要加【】才可以;
引用的基本使用:
作用:给变量起别名
语法:数据类型 &别名 = 原名;
引用注意事项:
#引用必须初始化;
#引用在初始化后,不可以改变;
引用做函数参数:
作用:函数传参时,可以利用引用的技术让形参修饰实参;
优点:可以简化指针修改实参;
总结:通过引用参数产生的效果同按地址传递是一样的。引用的语法更清楚简单。
引用做函数返回值:
作用:引用是可以作为函数的返回值存在的;
注意:不要返回局部变量引用;
用法:函数调用作为左值;
引用的本质:
本质:引用的本质在C++内部实现是一个指针常量
结论:C++推荐用引用技术,因为语法方便,引用本质是指针常量,但是所有的指针操作编译器都帮我们做了;
常量引用:
作用:常量引用主要用来修饰形参,防止误操作;
#在函数形参列表中,可以加 const 修饰形参,防止形参改变实参;
函数提高:
函数默认参数:
在C++语法中,函数的形参列表中的形参是可以有默认值的。
语法:返回值类型 函数名 (参数 = 默认值){ }
注意事项:
1、如果某个位置已经有了默认参数,那么从这个位置往后,从左到右都必须有默认值;
2、如果函数声明有默认参数,函数实现就不能有默认参数,声明和实现只能有一个默认参数;
函数占位参数:
C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置;
语法:返回值类型 函数名 (数据类型){ }
函数重载:
函数重载概述:
作用:函数名可以相同,提高复用性;
函数重载满足条件:
1、同一个作用域下;
2、函数名称相同;
3、函数参数类型不同 或者 个数不同 或者 顺序不同;
注意:函数的返回值不可以作为函数重载的条件;
函数重载注意事项:
#引用作为重载条件;
#函数重载碰到函数默认参数,出现二义性,报错,尽量避免这种情况;
类与对象:
C++面对对象的三大特性为:封装、继承、多态;
C++认为万事万物都皆为对象,对象上有其属性和行为;
例如:
人可以作为对象,属性有姓名、年龄、身高、体重…行为有走、跑、跳、吃饭、唱歌…
车也可以作为对象,属性有轮胎、方向盘、车灯…行为有载人、放音乐、放空调…
具有相同性质的对象,我们可以抽象称为类,人属于人类,车属于车类;
封装:
封装的意义:
封装时C++面对对象三大特性之一
封装的意义:
#将属性和行为作为一个整体,表现生活中的事物;
#将属性和行为加以权限控制;
封装意义一:
在设计类的时候,属性和行为写在一起,表现事物;
语法:class 类名{ 访问权限: 属性 / 行为 };
总结:
#类中的属性和行为统一称为成员;
#属性也称为 成员属性 or 成员变量;
#行为也称为 成员函数 or 成员方法;
封装意义二:
类在设计时,可以把属性和行为放在不同的权限下,加以控制;
访问权限有三种:
1.public 公共权限(成员 类内可以访问 类外可以访问);
2.protected 保护权限(成员 类内可以访问 类外不可以访问);
3.private 私有权限(成员 类内可以访问 类外不可以访问);
struct 和 class区别:
在C++中 struct 和 class 唯一的区别就在于默认的访问权限不同;
区别:
#struct 默认权限为公有;
#class 默认权限为私有;
成员属性设置为私有:
优点1:将所有成员属性设置为私有,可以自己控制读写权限;
优点2:对于写权限,我们可以检测数据的有效性;
对象的初始化和清理:
#生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用时候也会删除一些自己信息数据保证安全;
#C++中的面向对象来源于生活,每个对象也都会有初始设置以及对象销毁前的清理数据的设置;
构造函数和析构函数:
#对象的初始化和清理也是两个非常重要的安全问题;
#一个对象或者变量没有初始状态,对其使用后果是未知;
#同样的使用完一个对象或变量,没有及时清理,也会造成一定的安全问题;
C++利用了 构造函数 和 析构函数 解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作;
对象的初始化和清理工作是编译器强制要我们做的事情,因此如果我们不提供构造和析构,编译器会提供编译器提供的构造函数和析构函数是空实现。
#构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器主动调用,无须手动调用。
#析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作。