C++语法基础

这里写目录标题

  • 基础语法
    • 第一个程序
    • 变量
    • 常量的定义
    • 关键字
    • 标识符命名 (变量命名)
    • sizeof的使用
    • 实型(浮点型)
    • 字符型
    • 转义字符
    • 字符串的定义
    • 布尔值
    • **输入**
    • 算数运算
      • 取模运算
      • 自增自减
      • 赋值运算符
      • 比较运算符
      • 逻辑运算符
    • if
      • 单行
      • 多行
      • 多条件
      • 嵌套(if内层还有if)
    • 三目运算符
    • switch
    • 循环
      • while
      • do...while
      • for循环
    • 嵌套循环
    • break
    • continue
    • goto
    • 数组
    • 数组名的作用
    • 冒泡排序
    • 二维数组
    • 二维数组名的使用
    • system(“pause”)
    • 函数
      • 值传递
      • 函数声明
      • 函数分文件编写
    • 指针
      • 变量定义
      • 指针类型所占空间
      • 空指针
      • const修饰指针
      • 数组和指针
    • 结构体
      • 定义结构体并且创建结构体变量并使用
      • 结构体数组
      • 结构体指针
      • 结构体嵌套结构体
        • 嵌套结构体定义
      • 结构体做参数
      • const在结构体中的使用
    • 程序的内存模型
      • 内存四区
        • 代码区
        • 全局区
        • 变量的作用域(补充)
        • 栈区
        • 堆区
        • new运算符
    • 引用
      • 基本语法
      • 注意事项
      • 引用传参数
      • 引用做函数返回值
      • 引用的本质
      • 常量引用
    • 函数高级
      • 形参默认值
      • 占位参数
      • 函数重载
      • 函数重载的注意事项

基础语法

第一个程序

C++语法基础_第1张图片
第六行是一个输出语句 其他都是标配

#include
using namespace std

int main(){
cout << "Hello world" << end1;


system("pause");

return 0;
}

变量

变量的定义以及输出
C++语法基础_第2张图片
输出
a=10

常量的定义

C++语法基础_第3张图片
两种方法 一种是宏定义 一种是const修饰
C++语法基础_第4张图片

关键字

C++语法基础_第5张图片

标识符命名 (变量命名)

C++语法基础_第6张图片

sizeof的使用

C++语法基础_第7张图片
可以测出数据类型占用内存的大小 单位是字节

实型(浮点型)

C++语法基础_第8张图片
C++语法基础_第9张图片
定义float时 要在数据后面加上小写字母f(因为c++默认小数都是double) 所以加上一个f表示强制类型转换

科学计数法:e后面表示:10的多少次方
将此结果与e前面那个数相乘

字符型

C++语法基础_第10张图片
C++语法基础_第11张图片
将字符型数据强转成int 可以输出字符对应的ASCII编码

转义字符

C++语法基础_第12张图片
1、在c++中 “<< endl” 就是换行的作用 也就是上面第一行代码等价于 cout << "hello world\n"
2、想要输出一个反斜杠 必须输入两个反斜杠
3、水平制表 可以使\t 后面的内容整齐的输出 \t前面会留出八个空格的位置 前面有几个元素就填几个位置

字符串的定义

C++语法基础_第13张图片

C++语法基础_第14张图片
c++风格字符串跟定义变量是一样的 前提是要加上一个头文件#include

布尔值

C++语法基础_第15张图片
赋值时 赋值汉字true 或者 false 输出会对应输出1、 0

实际上 除了0 其他数都是真,习惯上用1代表真

输入

C++语法基础_第16张图片
输入:cin>>+变量

算数运算

取模运算

C++语法基础_第17张图片
取模:%(也就是取余)
只有整形变量可以取模 小数不可以

自增自减

赋值运算符

C++语法基础_第18张图片

比较运算符

C++语法基础_第19张图片
返回值是0或者1

逻辑运算符

C++语法基础_第20张图片
返回值是真或者假 所以返回值是0或者1

逻辑与:同真为真 其他为假
逻辑或:同假为假 其他为真

if

单行

多行

C++语法基础_第21张图片

多条件

C++语法基础_第22张图片
else if 会排除前一个if的范围 所以设置各个if范围时 最好按照线性顺序进行设置

如下图

C++语法基础_第23张图片

嵌套(if内层还有if)

C++语法基础_第24张图片

三目运算符

C++语法基础_第25张图片
注意!!!
C++语法基础_第26张图片
三目运算符返回的是变量 所以可以视为一个整体 继续赋值

switch

C++语法基础_第27张图片
1、case 结果后加冒号
2、每个case都要加break
3、最后如果都不满足 那么可以用default+冒号
4、C++语法基础_第28张图片

循环

while

在这里插入图片描述

do…while

C++语法基础_第29张图片

for循环

嵌套循环

C++语法基础_第30张图片
口诀:
外层一次 内层一周

break

C++语法基础_第31张图片
C++语法基础_第32张图片
使用在嵌套结构中时 用于退出内层循环

continue

C++语法基础_第33张图片

goto

C++语法基础_第34张图片
会跳转到标记位置

不过不建议使用

数组

C++语法基础_第35张图片
第二种是最全的
第一种和第三种均是省略了其中一部分
第三种会自动识别花括号里元素的个数

C++语法基础_第36张图片
最全的方式会自动补0

数组名的作用

C++语法基础_第37张图片
可以通过sizeof(数组名)来获取数组的总长度 单位是字节
sizeof(arr【0】)可以获取某个数据的长度

数组名是首地址 不用取地址符号 并且是常量
但是除数组名之外 取其他元素的地址的时候 要加取地址符&

冒泡排序

C++语法基础_第38张图片

轮数是外层循环

内层与外层存在某个关系 找到这个关系即可实现

代码
C++语法基础_第39张图片

二维数组

C++语法基础_第40张图片
C++语法基础_第41张图片
第二种在使用时 还可以将其换行定义 不过注意要加逗号 这样更加的直观

二维数组名的使用

C++语法基础_第42张图片
C++语法基础_第43张图片
总结:
1、利用sizeof来获取大小 同时还可以利用这个来计算出行数列数
2、二维数组存储的时候 也是一连串的存储形式 所以“整个数组的首地址”、“第一行首地址”、“第一个元素首地址”指的是同一个地址

system(“pause”)

功能:任意键继续

函数

值传递

C++语法基础_第44张图片
实参将值传递给

函数声明

C++语法基础_第45张图片

函数分文件编写

C++语法基础_第46张图片
C++语法基础_第47张图片
C++语法基础_第48张图片
将函数的声明单独放在一个头文件里(后缀为.h)

注意 函数声明的头文件里还要写
#include
using namespace std;
不然函数源文件链接到该头文件时 某些iostream库里的功能无法使用

C++语法基础_第49张图片
函数的源文件 函数的定义写在一个源文件里 头文件用刚刚声明函数的头文件

自定义的头文件引用时 用双引号

C++语法基础_第50张图片
在主函数中 引用#include
using namespace std;

以及 函数声明的自定义头文件 这样函数才可以正常使用

指针

变量定义

C++语法基础_第51张图片

指针类型所占空间

C++语法基础_第52张图片
对于64位系统 指针变量(变量数据类型 * )所占空间为8字节

空指针

C++语法基础_第53张图片
空指针 指针变量指向内存编号为0的空间 用于初始化指针变量

注意0到255编号的内存无法访问

C++语法基础_第54张图片
野指针 就是随意找一块未申请的空间 强转为指针类型 这样是不被允许的 又可能会使用到正在使用的空间

对于这种没有申请的空间 不要进行访问

const修饰指针

C++语法基础_第55张图片
C++语法基础_第56张图片
C++语法基础_第57张图片
C++语法基础_第58张图片
C++语法基础_第59张图片
上面三个图中红色是不可以进行的 黑色是可以进行的

数组和指针

C++语法基础_第60张图片
数组名赋值给指针变量 这样指针变量就拿到了数组的首地址 也是第一个元素的地址

之后对指针变量p++ 就可以移到下一个地址单元

C++语法基础_第61张图片
地址传递会同步值

结构体

定义结构体并且创建结构体变量并使用

C++语法基础_第62张图片
在这里插入图片描述
结构体就是自己自定义一个数据类型 该数据类型是一些基本数据类型的集合,

对于结构体变量的创建以及初始化,常用的有两种方式 一种是无参构造,结构体类型名+结构体变量名
后续再对属性进行赋值

第二种是有参变量 结构体类型名+结构体变量名+“=”+{初始化属性}

结构体数组

C++语法基础_第63张图片

C++语法基础_第64张图片
仍然是
数据类型+数组名+初始化

数据类型是自定义的结构体类型,同时也是单个数组元素的类型

这样每个元素都是一个结构体变量 变量名就是数组加索引

结构体指针

C++语法基础_第65张图片
指针类型与指向的数据类型对应 所以是struct student *p=&stu;

这样 指针就指向了某个结构体变量(这里以stu为例) 可以通过箭头来访问或者修改成员属性

结构体嵌套结构体

嵌套结构体定义

C++语法基础_第66张图片
教师结构体里嵌套学生结构体 直接数据类型(也就是结构体类型)+结构体变量
C++语法基础_第67张图片
使用时 需要两层点

结构体做参数

C++语法基础_第68张图片
C++语法基础_第69张图片
在这里插入图片描述
总之 单纯一个结构体变量传递的话 仅仅是值传递
如果传递取地址符+结构体变量 那么会传递结构体的地址 而另一边也应该定义一个指针来接收 例如 student *p

const在结构体中的使用

C++语法基础_第70张图片
C++语法基础_第71张图片
结构体地址做参数 可以节省空间 因为值传递会复制一份数据 而地址传递不会复制数据 但是地址传递会同步函数外面main函数的内容 所以为了防止在函数中对main函数的内容做修改 所以 用const来修饰函数的指针参数 相当于常量指针,指针的指向可以改 指针指向的值不可以改,进而增加了安全性

程序的内存模型

内存四区

代码区

C++语法基础_第72张图片
C++语法基础_第73张图片

全局区

C++语法基础_第74张图片
局部变量 一切在函数中定义的变量称为局部变量(包括main函数)
C++语法基础_第75张图片
C++语法基础_第76张图片

变量的作用域(补充)

C++语法基础_第77张图片

栈区

C++语法基础_第78张图片
注意事项 不要返回局部变量的地址 因为局部变量在栈 函数执行完就会自动销毁
但是返回之后 编译器会对数据进行保留一次
但是第二次再调用该数据的地址 就不会保留“数据” 但是“地址”还是存在 所以可以调用地址 只不过调用出来解数据出来的结果是乱码

堆区

C++语法基础_第79张图片
利用new关键字 开辟一个空间 并且可以给这个空间赋值 这个new这一部分会返回一段地址

C++语法基础_第80张图片
接收到函数返回值之后 在main函数中用一个指针接收 这时 main函数接到了地址 并且是堆区数据的地址 由于栈销毁的是数据而不是地址 所以 可以持续使用该地址 并且可以解引用解码出来正确的数据 因为该数据不在栈 而是在堆

C++语法基础_第81张图片

new运算符

C++语法基础_第82张图片
C++语法基础_第83张图片
C++语法基础_第84张图片
对于开辟一个数据 new + 数据类型+(初始化赋值),返回一个指针

最后要释放堆区数据 delete new时创建的指针变量;
C++语法基础_第85张图片
对于开辟一个数组 new + 数据类型+【元素个数】

最后要释放数组 delete【】 new时创建的指针变量;

引用

基本语法

C++语法基础_第86张图片

C++语法基础_第87张图片
C++语法基础_第88张图片
引用数据类型 给变量起一个别名 这样例如变量a、b使用的是同一块地址

语法 引用数据类型 +&别名=原名

注意事项

C++语法基础_第89张图片

引用传参数

C++语法基础_第90张图片
C++语法基础_第91张图片

引用做函数返回值

此时main函数中的test01()相当于“int & a”
C++语法基础_第92张图片
引用做返回值时 此时main函数中的test01()相当于“a的引用别名”

不可以返回局部变量的引用 因为局部变量在函数执行完之后 就被销毁了

C++语法基础_第93张图片
引用做返回值时 此时main函数中的test02()相当于“a的引用别名”

返回静态变量的引用时 可以把函数调用当作左值 这样a的别名被重新赋值 那么a这块地址的变量也被重新赋值

引用的本质

C++语法基础_第94张图片
这也就是为什么引用一旦初始化 那么无法更改引用 只能做赋值操作

常量引用

主要作用
C++语法基础_第95张图片

C++语法基础_第96张图片
1、定义引用变量时 原本是需要一个已经定义好了的变量空间 也就是给已知的变量起一个别名

但是如果直接赋值一个具体的数 是无法运行的

如果前面加了const 那么就可以直接赋值 这时编译器会临时创建一个变量给你使用 但是我们并不知道变量的名字
而且 现在的变量的值无法更改

2、但是 常量引用一般用在修饰形参
因为引用变量是地址共用,所以函数中的操作会影响到main函数,所以要做一些操作 防止函数中的操作影响到主函数
所以在形参前面加const 这样 引用变量(形参)就无法被再赋值了

函数高级

形参默认值

C++语法基础_第97张图片
语法
C++语法基础_第98张图片
注意点 1、某个参数位置有默认值,那么这个位置往后都要有默认值
2、函数声明和函数实现不能同时有默认参数 ,默认值并不影响函数调用时的赋值,赋值优先

占位参数

C++语法基础_第99张图片
C++语法基础_第100张图片
占位参数定义时,只写一个数据类型即可 无需写变量
调用时虽然定义的参数没有变量,但是仍然要传入一个对应类型的数

函数重载

C++语法基础_第101张图片
使用函数重载,可以提高代码的复用性 根据形参列表的不同 来区别不同的函数
C++语法基础_第102张图片

函数重载的注意事项

1、引用可以作为重载的条件

区分引用参数是否加const
如果无const 那么一般的引用都会调用该函数
如果加了const 那么调用时 会与传入常量的那个调用语句对应

(注意点:引用参数如果不加const 那么只能接收栈区和堆区的变量,也就是局部变量和new出来的变量 常量属于全局区)
C++语法基础_第103张图片
C++语法基础_第104张图片
2、函数重载碰到默认参数

因为参数列表如果有默认参数 那么该参数位置可以不传入值
这样就会造成与“没有默认参数的函数”的传入列表相同的情况
所以,尽量避免用默认参数来进行函数重载
C++语法基础_第105张图片
在这里插入图片描述

你可能感兴趣的:(c++)