thread_local 存储类
- 使用 thread_local 说明符声明的变量仅可在它在其创建的线程上访问
- 变量在创建线程时创建,并在销毁线程时销毁
- thread_local 说明符可以与 static 或 extern 合并
- 每个线程都有其自己的变量副本
位运算符
- ^ : binary加
- << : 向左移动指定的位数
杂项运算符
- sizeof : 返回变量的大小
- , : 顺序执行一系列运算。整个逗号表达式的值是以逗号分隔的列表中的最后一个表达式的值
- Cast : 强制转换运算符把一种数据类型转换为另一种数据类型。例如,int(2.2000) 将返回 2
C++ 函数
- 每个 C++ 程序都至少有一个函数,即主函数 main()
- 可以把代码划分到不同的函数中
- 函数声明告诉编译器函数的名称、返回类型和参数
- C++ 标准库提供了大量的程序可以调用的内置函数。例如,函数 strcat() 用来连接两个字符串,函数 memcpy() 用来复制内存到另一个位置
- 函数还有很多叫法,比如方法、子例程或程序
- 向参数传递一个值,这个值被称为实际参数
- 函数声明会告诉编译器函数名称及如何调用函数
- 在函数声明中,参数的名称并不重要,只有参数的类型是必需的
- 在一个源文件中定义函数且在另一个文件中调用函数时,函数声明是必需的。在这种情况下,您应该在调用函数的文件顶部声明函数
函数参数
- 如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数
- 形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁
三种向函数传递参数的方式:
- 传值调用 : 该方法把参数的实际值赋值给函数的形式参数。在这种情况下,修改函数内的形式参数对实际参数没有影响
- 指针调用 : 该方法把参数的地址赋值给形式参数。在函数内,该地址用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数
- 引用调用 : 该方法把参数的引用赋值给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数
- 默认情况下,C++ 使用传值调用来传递参数
参数的默认值
- 可以为参数列表中后边的每一个参数指定默认值
- 如果实际参数的值留空,则使用这个默认值
- 在函数定义中使用赋值运算符来为参数赋值
Lambda 函数与表达式
- C++11 提供了对匿名函数的支持
- Lambda 表达式把函数看作对象,比如可以将它们赋给变量和作为参数传递,还可以像函数一样对其求值
[capture](parameters)->return-type{body}
[](int x, int y){ return x < y ; }
- 在Lambda表达式内可以访问当前作用域的变量,这是Lambda表达式的闭包(Closure)行为
- 与JavaScript闭包不同,C++变量传递有传值和传引用的区别,可以通过前面的[]来指定
- [] // 沒有定义任何变量。使用未定义变量会引发错误
- [x, &y] // x以传值方式传入(默认),y以引用方式传入
- [&] // 任何被使用到的外部变量都隐式地以引用方式加以引用
- [=] // 任何被使用到的外部变量都隐式地以传值方式加以引用
- [&, x] // x显式地以传值方式加以引用。其余变量以引用方式加以引用
- [=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用
- 对于[=]或[&]的形式,lambda 表达式可以直接使用 this 指针。但是,对于[]的形式,如果要使用 this 指针,必须显式传入
C++ 数学运算
- 需要引用数学头文件 <cmath>
- hypot(double, double); 返回两个参数的平方总和的平方根
- rand(),该函数只返回一个伪随机数
- 生成随机数之前必须先调用 srand() 函数
// 设置种子
srand( (unsigned)time( NULL ) );
cout<<rand();
C++ 数组
- 所有的数组都是由连续的内存位置组成
- 最低的地址对应第一个元素,最高的地址对应最后一个元素
- 省略掉了数组的大小,数组的大小则为初始化时元素的个数
- C++ setw() 函数用于设置字段的宽度, n 表示宽度
- 当后面紧跟着的输出字段长度小于 n 的时候,在该字段前面用空格补齐,当输出字段长度大于 n 时,全部整体输出
- 可以 setfill() 配合使用设置其他字符填充
多维数组
type name[size1][size2]...[sizeN];
- 内部嵌套的括号是可选的
- C++ 不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针
- C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量
int * getRandom( )
{
static int r[10];
// 设置种子
srand( (unsigned)time( NULL ) );
for (int i = 0; i < 10; ++i)
{
r[i] = rand();
cout << r[i] << endl;
}
return r;
}
- C++ 中您可以通过指定不带索引的数组名来传递一个指向数组的指针
- C++ 传数组给一个函数,数组类型自动转换为指针类型,因而传的实际是地址
- C++ 不会对形式参数执行边界检查
- 数组名是指向数组中第一个元素的常量指针
在函数中传递一个一维数组作为参数,您必须以下面三种方式来声明函数形式参数:
- 形式参数是一个指针
myFunction(int *param)
- 形式参数是一个已定义大小的数组
myFunction(int param[10])
- 形式参数是一个未定义大小的数组
myFunction(int param[])
字符串
- C 风格的字符串
- 字符串实际上是使用 null 字符 '\0' 终止的一维字符数组
- 不需要把 null 字符放在字符串常量的末尾,C++ 编译器会在初始化数组时,自动把 '\0' 放在字符串的末尾
- strcpy,strcat,strlen,strcmp,strchr,strstr