c++ 学习笔记
1.1 常量的两种表示
1、#define(宏定义)
2、const 修饰的变量
const 数据类型 变量名 = 常量值
1.2 C++ 关键字
即在给变量或者常量起名称时不得使用C++关键字,否则将产生歧义
1.3 标志符命名规则
1、标志符不能是关键字
2、标志符只能由字母、数字、下划线组成
3、第一个标志符必须为字母或下划线
4、标识符中字母区分大小写
1.4 数据类型
sizeof 关键字
利用sizeof关键字可以统计数据类型所占内存大小
整型:short(2)
int (4)
long(4)
long long(8)
语法:sizeof(数据类型 / 变量)
实型(浮点型) 占用空间 有效数字范围
1、单精度float 4字节 7位有效数字
2、双精度double 8字节 15-16位
字符型
用于显示单个字符
语法
char ch = ‘a’;
注:1.在显示字符型变量时,用单引号将字符括起来
2.单引号内只能有一个字符,不可以是字符串
C与C++中字符型变量并不是把字符本身放进内存中存储,而是将对应的ASCII编码放入存储单元
转义字符
作用:用于表示一些不能显示出来的ASCII字符
例如:\n (换行)
\(反斜杠)
\t(水平制表符)
字符串型
1、C语言风格语法
char 变量名[] = “字符串值”
字符串需要用双引号括起来
2、C++风格字符串
string 变量名 = “字符串值”
注:老版本的编译器需要一个头文件 #include
布尔类型 bool
true –真(本质是1)
false –假(本质是0)
bool类型占一个字节大小\
实参与形参
形参:在方法声明
实参:实际参与运算
1.5 数据的输入
用于从键盘获取数据
语法:cin >> 变量
1.6 算术运算符
作用:用于处理四则运算
1.7 比较运算符
作用:用于表达式的比较,并返回一个真值或假值
== 相等于
!= 不等于
< 小于
大于
<= 小于等于
= 大于等于
1.8 逻辑运算符
作用:用于根据表达式的值返回真值或假值
! 非
&& 与
|| 或
2.1 程序流程结构
C/C++ 支持的三种程序运行结构:顺序运行、选择运行、循环运行
顺序结构:结构按顺序执行,不发生跳转。
选择结构:依据条件是否满足,有选择的执行相应程序。
循环结构:依据条件是否满足,循环多次执行某段代码。
if语句
单行格式if语句:if(条件){条件满足执行的语句}
多行格式if语句:if(条件){满足执行的语句}else{条件不满足执行的语句};
多条件的if语句:if(条件满足执行1的语句 )else if(条件二){条件满足执行2的语句}…….else{都不满足执行的语句}
在if语句中,可以嵌套使用if语句,到达更精确的条件判断。
三目运算符
作用:通过三目运算实现简单的判断
语法:表达式1 ? 表达式2 : 表达式3
如果表达式1的值为真,执行表达式2,并返回表达式2的结果
如果表达式1的值为假,执行表达式3,并返回表达式3的结果
常见的语句
switch语句
作用:执行多条件分支语句
语法:
switch(表达式)
{
case 结果1:执行语句;braek;
case 结果2:执行语句;braek;
…
default:执行语句;braek;
}
while 循环语句
作用:满足循环语句时,执行循环结构
语法:while(循环条件){循环语句}
只要循环条件为真,就一直执行该项。
do while循环语句
作用:满足循环语句条件,执行循环语句
语法: do{循环语句}while(循环条件);
与while的区别在于do…while会先执行一次循环语句再判断循环条件
for循环语句
作用:满足循环条件时执行循环语句
语法:for(起始表达式;条件表达式;末尾循环体){循环语句}
嵌套循环
作用:在循环中在嵌套一层循环
跳转语句
break语句
作用:用于跳出选择结构或者循环结构
break使用的时机:
出现在switch条件语句中,作用是中止case并跳出switch
出现在循环语句中,作用是跳出当前的循环语句
出现在嵌套语句中,跳出最近的内层循环语句
comtinue语句
作用:在一个循环语句中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环
goto语句
作用:可以无条件跳转语句
如果标记的名称存在,执行到goto语句时,会跳转标记的位置。
枚举
枚举值表也叫枚举元素列表 列出定义的枚举类型的所有可用值 各个值之间用 “ , ” 分开
3.1 数组
作谓数组,就是一个集合,里面存放了相同类型的数据元素
特点:1、数组中每个数据元素都是相同的数据类型
2、数组是由连续的内存位置组成的
一维数组
定义的三种方式:
1、数据类型 数组名[数组长度];
2、数据类型 数组名[数组长度] = {值1,值2,值3….}
3、数据类型 数组名[] = {值1,值2,值3,….}
数组名称的用途:
1、可以统计整个数组在内存中的长度
2、可以获取数组在内存中的首地址
冒泡排序
作用:最常见的排序算法,对数组内元素进行排序、
1、比较相邻的排序算法,对数组内的元素进行排序
2、对每对相邻的元素做同样的工作,执行完成后,找到一个最大值
3、重复以后的步骤,每次比较次数-1 直到不需要比较
二维数组
函数
作用:将一段经常使用的代码封装起来,减少重复代码
一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能。
定义:
1、返回值类型
2、函数名
3、参数列表
4、函数体语句
5、return表达式
语法:
返回值类型 函数名 (参数列表)
{
函数体语句
return表达式
}
函数的调用
语法:函数名(参数)
值传递
所谓值传递,就是函数调用时实参将数值传入给形参
值传递时,如果形参发生变化,并不影响实参
###函数的常见样式
1、无参无返
1 | void test1() |
2、有参无返
void test2(int a)
{
cout << “…..” << a << endl;
}
3、有参有返
4、无参有返
函数的声明
作用:告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。
函数的声明可以多次,但函数的定义只能有一次。
函数的分文件编写
作用:让代码结构更加清晰
函数分文件编写步骤:
1、创建后缀名为.h的头文件
2、创建后缀名为.cpp的源文件
3、在头文件中写函数的声明
4、在源文件中写函数的定义
指针
指针的作用:可以通过指针间接访问内存
可以用利用指针变量保存内存
指针变量的定义与使用
指针变量定义语法:数据类型 * 变量名
指针所占内存空间
在32位操作系统下,指针是占4个字节空间大小,不管是什么数据类型
在64位操作系统下,指针是占8个字节空间大小,不管是什么数据类型
空指针和野指针
空指针:指针变量指向内存中编号为0的空间
用途:初始化指针变量
注:空指针指向的内存是不可以访问的
野指针:指针变量指向非法的内存空间
1 | int &p = (int *)0x1100; |
const修饰指针
1、const修饰指针 —常量指针
2、const修饰常量 —指针常量
3、const即修饰指针,又修饰常量
this 指针
this指针指向被调用的成员函数所属的对象
this指针不需要定义 直接使用
用途:当形参和成员变量同名时,可用this指针来区别
在类的静态=成员函数返回对象本身,可使用return *this
指针与数组
作用:利用指针访问数组中的元素
指针与函数
利用指针作函数参数,可以修改实参的值
结构体
结构体属于用户自定义的数据类型,允许用户存储不同的数据类型
结构体定义与使用
语法:struct 结构体名(结构体成员列表)\
三种结构体创建变量的方式
1、struct 结构体名 变量名
2、struct 结构体名 变量名={成员1值, 成员2值…}
3、定义结构体时顺便创建变量\
随机数种子
srand(( unsiged int)time(NULL));
需要头文件
第二阶段 面向对象
内存分区模型
C++ 程序在执行时,将内存方向划分成四个区域
1、代码区:存放函数的二进制代码,由操作系统进行管理的(程序在执行前) \
2、全局区:存放全局变量和静态变量以及常量。(程序在执行前)
3、栈区:由编译器自动分配释放,存放函数的参数值,局部变量等。(程序在执行后)
4、堆区:由程序员分配和释放,程序结束时由操作系统回收。
不同区域的数据,赋予不同的生命周期,给我们带来更大的灵活性。
new 操作符
C++ 通过new操作符在堆区开辟数据
堆区开辟的数据由程序员手动开辟手动释放,释放用操作符delete
语法:new 数据类型
利用new创建的数据,会返回该数据对应类型的指针。
引用
作用:给变量起别名
语法: 数据类型 &别名 = 原名
引用必须初始化
引用在初始化后,不可以改变。
引用做函数参数
作用:做函数时,可以用引用的的技术让形参修饰实参
优点:可以简化指针修饰实参
mySwap02(a,b); 值传递, 形参不会修饰实参
mySwap03(&a, &b); 地址传递,形参会修饰实参的
引用做函数的的返回值
作用:引用可以作为函数的返回值存在的
注:不要返回局部变量引用
用法:函数调用作为左值
int在声明和定义变量时使用,它表示的意思是所声明或所定义的变量为整型变量。如果其用于函数参数时,其传递方向为值传递,即只能将实参的值传递给形参,而不能将形参的值传递给实参。
int&这里的&不是取地址符号,而是引用符号,引用是C++对C的一个重要补充。变量的引用就是变量的别名,讲的通俗一点就是另外一个名字。
引用的本质
引用的本质在C++内部实现是一个指针常量
c++ 的引用
作用:常量引用主要用来修饰形参,防止误操作
在函数形参列表中,可以加const修饰形参,防止形参改变实参
如果函数的某个位置有默认值,那么从这个位置往后从左到右必须要有默认值
注:函数的声明与实现只能有一个有默认参数
函数占位参数
C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置
语法:返回值类型 函数名 (数据类型){}
函数(高级)
函数重载
函数重载概述 作用:函数名可以相同,提高复用性.
函数重载满足条件:
1.同一个作用域下
2.函数名称相 同
3.函数参数类型不同,或者个数不同,或者顺序不同\
注:函数的返回值不可以作为函数重载的条件。
注意事项:1、引用作为函数重载条件
2.函数重载碰到函数默认参数
类与对象
C++面向对象的三大特征:封装、继承、多态
C++认为万物都皆对象,对象上有其他属性和行为
封装
意义:1、将属性与行为作为一个整体,表现生活中的事物
2、将属性和行为加以权限控制
封装含义:在设计的时候,属性与行为写在一起,表现生活中的事物语法:
class 类名( 访问权限:属性 /行为)
访问权限
1、public 公共权限 成员 类内可以访问 类外可以访问
2、protected 保护权限 成员 类内可以访问 类外不可以访问
3、private 私有权限 成员 类内可以访问 类外不可以访问
struct 和 class 的区别
在C++中struct 和class唯一的区别在于默认的访问权限不同
struct 默认权限为共有
class 默认权限为私有\
成员属性设置为私有
优点1:将所有成员属性为私有,可以自己控制读写权限
优点2:对于写权限,我们可以检测数据的有效性
对象的初始化与清理
C++中的面向对象来源于生活,每个对象也都会有初始设置以及 对象销毁前的清理数据的设置
构造函数和析构函数
(当我们不提供构造和析构,编译器会提供编译器提供的构造函数和析构函数是空实现)
构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译自动器调用,无需手动调用。
析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作。\
构造函数语法 类名(){}
1.构造函数,没有放回值也不写void
2.函数名与类相同
3.构造函数可以有参数,因此可以发生重载
4.程序在调用时候会自动调用构造,无需手动调用,而且只会调用一次\
析构函数语法 类名(){}
1.析构函数,没有返回值也不写void
2.函数名称与类名相同,在名称前加上符号 ~ \
3.析构函数不可以有参数,因此不可以发生重载
4.程序在对象销毁前会自动调用析构,无需手动调用,而且只会调用一次\
构造函数的分类及调用
按参数分为:有参数和无参构造
按类型分为:普通构造和拷贝构造
三种调用方式:括号法、显示法、隐式转换法
注意事项:1、在调用默认构造函数时候,不要加()
因为下面这段代码编译器会认为是一个函数的声明,不会认为在创建对象\
拷贝构造函数调用时机
C++中拷贝构造函数调用时机通常有三种情况
1、使用一个已经创建完毕的对象来初始化一个新的对象
2、值传递都方式给函数参数传值
3、以值传递的方式给函数参数传值
构造函数调用规则
默认情况下,C++编译器至少给一个类添加3个函数
1、默认构造函数(无参,函数体为空)
2、默认析构函数(无参,函数体为空)
3、默认拷贝构造函数,对属性进行值拷贝
构造函数调用规则如下
如果用户定义有参构造函数,C++不在提供默认无参构造,但会提供默认拷贝构造
如果用户定义有参构造函数,C++不会再提供其他构造函数
深拷贝与浅拷贝
浅拷贝:简单的复制拷贝操作
深拷贝:在堆区重新申请空间,进行拷贝操作
初始化列表
作用:C++提供了初始化列表语法,用来初始化属性
语法:构造函数():属性1(值1),属性2(值2)·····{}
类对象作为类成员
C++类中的成员可以是另一类的对象,我们称为成员为 对象成员
静态成员
静态成员就是在成员变量和成员函数之前加上关键字static,称为静态成员
分为
1、静态成员变量
2、静态成员函数\
person::A_m 表示类person中的成员A_m
继承
同名成员处理
访问子类对象 访问到父类中同名成员时,需要加作用域
例如:cout << s.Base::m_A << endl; \
调用父类中的同名成员函数 意一样加作用域
继承同名静态成员处理方式
与非静态成员的访问方式一致 父类加作用域
多继承语法
C++允许一个类继承多个类
语法:class 子类: 继承方式 父类1,继承方式 父类2 …….
多态
分类
1、静态多态:函数重载和运算符重载属于静态多态,复用函数名
2、动态多态:派生类和虚函数实现运行时多态
区别:
静态多态的函数地址早绑定 - 编译阶段确定函数地址
动态多态的函数地址晚绑定 - 运行阶段确定函数地址
使用动态多态时,及在父类函数加入关键字virtual,然后子类要重写父类的虚函数。(子类重写时 virtual 子类 可不写)
文件操作
程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放
通过文件可以将数据持久化
c++中对文件操作需要包含头文件
文件类型分两种
1、文本文件 以本文的ASCII码形式存储在计算器中
2、二进制文件:文件以文本的二进制形式存储在计算器中,用户一般不能直接读懂它\
操作文件的三大操作
1、ofstream:写操作
2、ifstreram:读操作
3、fstream:读写操作\
具体操作(文本文件)
1、包含头文件
#include
2、创建流对象
ofsteram ofs;
3、打开文件
ofs.open(“文件路径“,打开方式);
4、写数据
ofs << “”写入到数据;
5、关闭文件
ofs.close();