C++基础-1
c++基础(同c比较)
C | C++ | |
---|---|---|
常规预处理命令 | <stdio.h> | |
输入 | scanf(“%d,%d”,&m,&n); | cin>>m>>n; |
输出 | printf(“%d”,m); | cout<<m; |
换行符 | \n | endl(\n依旧沿用) |
C++的数据类型
*布尔常量:布尔常量其数据类型为bool ,其取值只有两个:false(假)和true(真)。
*C++的基本数据类型与C基本相同:
基本数据类型(以32位编译系统为例)
类型名 | 字宽 | 取值范围 |
---|---|---|
char | 1 | -128~127 |
signed char | 1 | -128~127 |
unsigned char | 1 | 0~255 |
short [int] | 2 | -32768~32767 |
signed short [int] | 2 | -32768~32767 |
unsigned short [int] | 2 | 0-65535 |
int | 4 | -2147483648~2147483647 |
signed [int] | 4 | -2147483648~2147483647 |
unsigned [int] | 4 | 0-4294967295 |
long [int] | 4 | -2147483648~2147483647 |
signed long [int] | 4 | -2147483648~2147483647 |
unsigned long [int] | 4 | 0-4294967295 |
float | 4 | 约6位有效数字 |
double | 8 | 约12位有效数字 |
long double | 16 | 约15位有效数字 |
定义C++语言的标识符应该遵循如下规则:
(1)标识符只能由字母、数字和下划线三类字符组成。
(2)第一个字符必须为字母(第一个字符也可以是下划线,但通常被视为系统自定义的标识符)。
(3)大写字母和小写字母被认为是两个不同的字符。
(4)标识符长度不限,其有效长度通常依赖于机器类型,为便于阅读,一般用有意义的单词序列的命名方法。
(5)标识符不能是C++的关键字。
C++系统关键字是系统已经预定义的一些标识符,它们的意义和作用由系统规定。
关键字 | 含义描述 | 关键字 | 含义描述 |
---|---|---|---|
break | 跳出循环体,结束循环 | public | 公有成员;公有继承 |
case | 分支语句中的分支 | return | 从函数中返回 |
char | 字符型数据 | short | 短整型数据 |
class | 定义类的关键字 | signed | 有符号型数据 |
const | 常量符号 | sizeof | 取数据类型长度运算符 |
continue | 跳出本次循环,进行下一次 | static | 静态数据 |
default | 分支语句中的默认分支 | struct | 定义结构体类型数据 |
delete | 释放指针指向的内存块 | switch | 分支语句 |
do | do型循环 | template | 声明模板 |
double | 双精度浮点型数据 | this | 本类指针 |
else | 判断语句中的否定分支 | typedef | 重定义数据类型 |
enum | 定义枚举型数据 | union | 定义联合体型数据 |
extern | 声明外部变量 | virtual | 虚继承;虚函数 |
float | 单精度浮点型数据 | void | 定义函数不返回数值 |
for | for型循环 | while | while型循环 |
friend | 友元类 | int | 整型数据 |
goto | 跳转语句 | long | 长整型数据 |
if | 条件判断语句 | new | 申请内存块 |
inline | 声明为内联函数 | operator | 定义运算符重载 |
protected | 保护成员;保护继承 | private | 私有成员;私有继承 |
C++中各类符号表示:
转义字符 | 名称 | 功能 |
---|---|---|
‘\a’ | 响铃符 | 用于输出 |
‘\b’ | 退格符 | 用于回退一个字符 |
‘\f’ | 换页符 | 用于输出 |
‘\r’ | 回车符 | 用于输出 |
‘\t’ | 水平制表符 | 用于制表 |
‘\’ | 反斜杠符 | 用于输出或文件的路径名中 |
‘\’’ | 单引号 | 用于输出单引号 |
‘\”’ | 双引号 | 用于输出双引号 |
‘\0’ | 空字符 | 用于结束标志 |
符号表示 | 含义描述 |
---|---|
+ | 加法运算符,或正值运算符 |
- | 减法运算符,或负值运算符 |
* | 乘法运算符 |
/ | 除法运算符 |
% | 求余运算符 |
符号表示 | 含义描述 |
---|---|
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
== | 相等 |
!= | 不相等 |
符号表示 | 含义描述 |
---|---|
~ | 按位求反 |
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
<< | 左移 |
>> | 右移 |
符号表示 | 含义描述 |
---|---|
! | 单目运算符,逻辑非 |
&& | 双目运算符,逻辑与 |
|| | 双目运算符,逻辑或 |
符号表示 | 含义描述 |
---|---|
+= | 加赋值 |
*= | 乘赋值 |
%= | 求余赋值 |
>>= | 右移位赋值 |
|= | 按位或赋值 |
-= | 减赋值 |
/= | 除赋值 |
<<= | 左移位赋值 |
&= | 按位与赋值 |
^= | 按位异或赋值 |
按位求反“~”是将各个二进制位由1变成0,由0变成1,它是一个单目运算符。
按位与“&”是将两个二进制位的操作数从低位到高位依次对齐后,每位求与运算。只有两个都是1时,结果为1,否则为0。
按位或“|”是将两个二进制位的操作数从低位到高位依次对齐后,每位求或运算。只有两个都是0时,结果为0,否则为1。
按位异或“^”是将两个二进制位的操作数从低位到高位依次对齐后,每位求异或运算。只要两个位不同时,结果为1,否则为0。
左移“<<”是将一个二进制数的数按指定移动的位数向左移动,移掉的被丢弃,右边移出的空位补0。
右移“>>”是将一个二进制数的数按指定移动的位数向右移动,移掉的被丢弃,左边移出的空位或者一律补0或者补符号位,这要由机器决定。
选择结构:
\1. if语句——单行if语句,多行if语句,多条件if语句,嵌套if(使用方式和c语言基本相同)
\2. 表达式?x:y——三目运算符(使用方法和c语言基本相同)
\3. Swtch语句——switch(整型和字符){case 常量:break;}(使用方法和c语言基本相同)
\4. While与do whlie语句——while(条件){循环体}/do{循环体}while(条件)(使用方法与c语言基本相同)
rand()生成一个【0,1)的随机数
函数:
函数的分文件编写:
1.创建后缀名.h的头文件
2.创建后缀名.cpp的源文件
3.在头文件中写函数的声明
4.在源文件中写函数的定义:包含
如上,再次使用的时候直接引用自定义头文件就能够使用已定义在另一文件的函数里。
指针:
空指针和野指针:
空指针:指针变量指向内存中编号为0的空间,用于初始化指针变量。
(注:指向的内存不可以访问,0~255之间的内存编号为系统占用。)
野指针:指针变量指向非法的内存空间【例如int*p=(int *)0x1100】
由于指针的指向内容不一定在所申请的内存空间范围内,在程序中尽可能避免出现访问非法(未申请空间)的野指针。
const修饰指针:
1.const修饰指针——常量指针(const int*p=&a):指针的指向可以修改,但是指针指向的值不可以改
2.const修饰常量——指针常量(int * const p=&a):指针的指向不可以改,但是指针指向的值可以改
3.const即修饰指针又修饰常量(const int * const p=&a):指针的指向和指针指向的值都不能改
函数指针:指向函数的指针
函数具有可赋值给指针的物理内存地址,一个函数的函数名就是一个指针,它指向函数的代码。
一个函数的地址是该函数的进入点,也是调用函数的地址。
函数的调用可以通过函数名,也可以通过指向函数的指针来调用。
函数指针还允许将函数作为变元传递给其他函数。
不带括号和变量列表的函数名,这可以表示函数的地址,正如不带下标的数组名可以表示数组的首地址。
定义形式:
类型 (*指针变量名)(参数列表);
例如:
int (*p)(int i,int j);
p是一个指针,它指向一个函数,该函数有2个整形参数,返回类型为int。
p首先和*结合,表明p是一个指针。然后再与()结合,表明它指向的是一个函数。
指向函数的指针也称为函数指针。
注意:
int *f(int i, int j);//返回值是指针的函数f |
结构体:
1.基本概念:
结构体属于用户自定义的数据类型,允许用户存储不同的数据类型
2.结构体定义和使用:
struct 结构体名称 { 结构体成员列表 }; |
通过结构体创建变量的方式如下三种:**(创建变量时,struct 关键字可以省略)**
struct 结构体名 变量名
struct 结构体名 变量名 ={ 成员1值,成员2值……}
定义结构体时顺便创建变量
3.结构体数组
作用:
将自定义的结构体放入数组中,方便自定义结构体的维护
形如:
struct 结构体名 数组名[元素个数] ={{},{},{}......}; |
结构体数组遍历:
for (int i = 0;i < 3;i++)//遍历每个结构体 |
4.结构体指针:
作用:通过指针访问结构体中成员
使用操作符->可以通过结构体指针访问结构体属性
在学习C++的过程中我们经常会用到.和::和:和->,在此整理一下这些常用符号的区别。 |
*注意:定义指针时,指针的类型应该与被指向的结构体变量相符,即用“struct 结构体名 * 指针名”*
5.结构体嵌套结构体
作用:在一个结构体内嵌套另一个结构体,即将结构体的成员设置为结构体(参考嵌套if)
注意:在定义外层结构体前,需要先定义内层结构体
6.结构体做函数参数
作用:将结构体作为参数向函数中传递
两种传递方式:值传递、地址传递(同基本数据类型相同)
7.结构体中const使用场景
作用:用const来防止误操作,一旦有修改的操作就会报错
引用:
1.用处:
给一个变量起别名,通过多个变量名修改变量值
2.形如:
数据类型 &别名 = 原名 |
3.注意事项:引用必须初始化,且在初始化后不可以改变
4.引用做函数参数
作用:函数传参时,可以利用引用的技术让形参修饰实参
优点:可以简化指针修改实参
5.引用做函数返回值
用法:函数调用可以作为左值
(f()=1000;先运行返回引用的函数f()得到返回值,然后返回值=1000)
注意:不要返回局部变量引用——可给局部变量加static前缀,变成静态变量
(第一次结果因为编译器做了保留,所以正确,但第二次局部变量已经被释放,结果会乱码错误。)
6.引用的本质:
引用在c++内部的实现,实际上是一个指针常量
7.常量引用
作用:常量引用主要用来修饰形参,防止误操作,在函数形参列表中加const修饰形参,防止形参改变实参
函数提高:
1.函数默认参数
语法:
返回值类型 函数名 (参数=默认值){函数体} |
注意事项:
1.如果某个位置已经有了默认参数,那么之后都必须有默认值
2.如果函数声明中有默认参数,函数实现中不能有默认参数(重定义)
2.函数占位参数
c++中函数的形参列表可以有占位参数,用来做占位,调用函数时,必须填补该位置
语法:
返回值类型 函数名 (数据类型无形参名){函数体} |
注意:占位参数也可以有默认参数
3.函数重载
作用:函数名可以相同,提高复用性
1.函数重载满足条件:
- 同一个作用域下
- 函数名称相同
- 函数参数类型不同,或者个数不同,或者顺序不同
*函数的返回值不可以作为函数重载的条件
2.注意事项:
引用作为重载条件(int &a——应用变量,const int &a——应用常量)
函数重载遇到函数的默认参数(在默认参数影响下,输入的函数参数个数可以变化,并有可能与重载的其他函数重复,从而产生错误)