目录
前言:
上篇文章介绍了c++的一些基本内容,这一篇会接着上文讲解c++的入门内容
注:c++循环、数组、指针和c语言的一样,这篇文章就先不做讲解的(●'◡'●)
上篇传送门:
1.存储类
存储类定义 C++ 程序中变量或者是函数的范围和生命周期,这些说明符放置在它们所修饰的类型之前。
- auto(从 C++ 17 开始,auto 关键字不再是 C++ 存储类说明符)
- register(从 C++ 17 开始,register 关键字被弃用。)
- 用于定义存储在寄存器中的局部变量,定义 'register' 并不意味着变量将被存储在寄存器中,它意味着变量可能存储在寄存器中,这取决于硬件和实现的限制。
- static
- 当用于修饰局部变量时,可以增加生命周期的范围和全局变量一样
- 当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内
- extern
- 用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。
- 外部修饰符👉如果有两个.c文件,其中一个定义变量i,并用extern修饰,那么在另一个文件中也可以在不定义的情况下使用
- mutable
- 说明符仅适用于类的对象,它允许对象的成员替代常量,即mutable 成员可以通过 const 成员函数修改。
- thread_local (C++11)
- 使用 thread_local 说明符声明的变量仅可在它在其上创建的线程上访问。 变量在创建线程时创建,并在销毁线程时销毁。 每个线程都有其自己的变量副本。
- thread_local 说明符可以与 static 或 extern 合并
c++数字运算及函数
数字定义:
依照不同的数据类型定义不同变量,赋值即可。
数字运算:
相关的运算符:
- 算术运算符
- =、+、-、*、/、取余%、++(自加)
- 关系运算符
![]()
- 逻辑运算符
&& 逻辑与运算符,如果两个操作数都 true,则条件为 true。 || 逻辑或运算符,如果两个操作数中有任意一个 true,则条件为 true。 ! 逻辑非运算符,用来逆转操作数的逻辑状态,如果条件为 true 则逻辑非运算符将使其为 false。
- 位运算符
- 位运算符作用于位,并逐位执行操作(&、 | 和 ^、~、<<、>>)
- &👉都为非0,才是1
- |👉有一个非0,就是1
- ^👉相同取0,相反取1
- ~👉取反
- 赋值运算符
- 基本的运算符和等号结合,有==、+=、-=、!=等赋值运算符,含义也比较简单,具体的参照下表:
= 简单的赋值运算符,把右边操作数的值赋给左边操作数 += 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 -= 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 *= 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 /= 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 %= 求模且赋值运算符,求两个操作数的模赋值给左边操作数 <<= 左移且赋值运算符 >>= 右移且赋值运算符 &= 按位与且赋值运算符 ^= 按位异或且赋值运算符 |= 按位或且赋值运算符
- 其他运算符
- sizeof、三元运算符、&、*、逗号运算符
sizeof 返回变量的大小。例如,sizeof(a) 将返回 4,其中 a 是整数。 Condition ? X : Y 如果 Condition 为真 ? 则值为 X : 否则值为 Y。 , 会顺序执行一系列运算。整个逗号表达式的值是以逗号分隔的列表中的最后一个表达式的值。 .(点)和 ->(箭头) 用于引用类、结构和共用体的成员。 Cast 把一种数据类型转换为另一种数据类型。例如,int(2.2000) 将返回 2。 & 返回变量的地址。例如 &a; 将给出变量的实际地址。 * 指向一个变量。例如,*var; 将指向变量 var。
相关函数:
c++中有很多内置函数供程序员使用,这里介绍一类数学函数:头文件为:<cmath>
运算符的优先级(图片源于菜鸟教程):
后缀 | () [] -> . ++ - - | 从左到右 |
一元 | + - ! ~ ++ - - (type)* & sizeof | 从右到左 |
乘除 | * / % | 从左到右 |
加减 | + - | 从左到右 |
移位 | << >> | 从左到右 |
关系 | < <= > >= | 从左到右 |
相等 | == != | 从左到右 |
位与 AND | & | 从左到右 |
位异或 XOR | ^ | 从左到右 |
位或 OR | | | 从左到右 |
逻辑与 AND | && | 从左到右 |
逻辑或 OR | || | 从左到右 |
条件 | ?: | 从右到左 |
赋值 | = += -= *= /= %=>>= <<= &= ^= |= | 从右到左 |
逗号 | , | 从左到右 |
c++引用:
传送门:
函数提高:
1.函数形参默认值:
当形参有默认值时,传入参数可以小于实际的形参数量,如果自己传入数据参数就是这个值,否则就是默认参数的值。
⭐注意事项:
如果有一个默认参数,那么从这个位置从左往右所有必去有默认参数,前面位置有没有不影响。
如果函数声明/实现有默认参数,则函数的实现/说明不能有默认参数👉这是为了防止声明和实现的默认参数不同,编译器不知道到底使用哪一个参数。
2.函数占位参数:
c++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置
例如:void fun(int a,int){ }
在主函数中如果输入fun(2),错误👉因为int站立一个位置,如果不填补位置则发生错误
⭐但是如果int后面加上=默认值,则也可以不用传入后面的值
3.函数重载:
函数名可以相同,提高函数名的复用型,但是要满足一定条件:
当两个函数都相同则会出错,提示👉函数已经有主体了
参数不一样或者参数的个数不同或顺序不同(这里不是指两个相同的类型的顺序不同,这里一定要不同类型形参的顺序不同)
根据不同的传入参数来判断到底进行哪个函数。
注意:函数返回值不能作为函数重载的条件
注意事项:
如果引用作为重载条件:
#include<iostream>
using namespace std;
void fun(int &a)
{
cout<<输出int &a调用;
}
void fun(const int &a)
{
cout<<输出const int &a调用;
}
int main(){
int a=10;//调用上面代码
fun(a);
fun(10);//调用下面代码
}
因为fun(a),a本身就是一个变量,而const修饰导致形参是一个只读的状态,,所以选择上面的fun函数
而fun(10),10不可能作为引用传入上面的函数,上面不合法,而下面的合法,因此选择下面的参数。
函数重载和默认参数发生碰撞:
#include<iostream>
using namespace std;
void fun(int a,int b=10)
{
cout<<a+b;
}
void fun(int a)
{
cout<<a;
}
int main(){
fun(10);//无法判断是哪个函数
}
这里无法判读是哪个函数,因为都满足条件而且都不出错,出现了二义性,会导致程序报错,因此尽量不同时使用,避免这种情况存在。
结语:
感谢观看,欢迎点赞收藏o(* ̄▽ ̄*)ブ
下期预告:⭐c++类和对象