C++ Basics
命名空间
定义:
namespace name {
// variables, functions, classes, typedef, #define
}
// Examples:
namespace Li {
int count;
}
使用方法一:使用域解析操作符::
使用方法二:使用 using
关键字
数据类型
基本内置类型:bool
, char
,int
,float
,double
,void
,wchart_t
wchart_t
是宽字符型,其实是typedef short int wchar_t
枚举类型
// enum 枚举名 {
// 标识符[=整型常数],
// 标识符[=整型常数],
// ...
// } 枚举变量;
enum color { red, green, blue } c;
c = blue;
常量
整数常量:
- 前缀:0x 或 0X 表示十六进制,0 表示八进制,无前缀十进制
- 后缀:U 或 u 表示
unsigned
,L 或 l 表示long
布尔常量:true
, false
浮点数常量
字符常量:括在单引号中,若以 L 开头,如 L’x’
为 wchar_t
类型
字符串常量:括在双引号中,可用 \
对字符串做分行
常量定义:
修饰符类型
数据类型修饰符:signed
,unsigned
,long
,short
类型限定符:
const
:执行期间不能被修改volatile
:编译器不需要优化变量,程序直接从内存汇总读取变量restrict
:修饰的指针是唯一一种访问它所指向的对象的方式
存储类
-
auto
:声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符。c++17 已删除 -
register
:定义存储在寄存器中而不是 RAM 中的局部变量(已被弃用) -
static
:在程序的生命周期内保持局部变量的存在。若修饰全局变量,会使变量的作用域限制在声明它的文件内。用在类数据成员上时,会导致仅有一个该成员的副本被类的所有对象共享。 -
extern
:提供一个全局变量的引用(用来在另一个文件中声明一个全局变量或函数) -
mutable
:允许对象的成员替代常量 -
thread_local
:使用 thread_local 说明符声明的变量仅可在它在其上创建的线程上访问。
运算符
算术运算符:+
,-
,*
,/
,%
,++
,--
关系运算符:==
,!=
,>
,<
,>=
,<=
逻辑运算符:&&
,||
,!
位运算符:&
,|
,^
,~
,<<
,>>
赋值运算符:=
,+=
,-=
,*=
,……
杂项运算符:sizeof
,Condition ? X : Y
,.
,->
,int()
,&
,*
运算符优先级(高到低):
- 后缀(括号,数组,成员访问)
- 一元(从右到左)(正号,负号,否定,位否定,增量,减量,引用,取址,类型转换,
sizeof
) - 乘除
- 加减
- 移位
- 关系
- 相等
- 位与
- 位异或
- 位或
- 逻辑与
- 逻辑或
- 条件(从右到左)
- 赋值(从右到左)
- 逗号
循环
循环类型:while
,for
,do... while
循环控制语句:break
,continue
,goto
判断
-
if,if...else
-
switch
函数
函数参数
-
传值调用
-
指针调用
-
引用调用
Lambda 函数(匿名函数):Lambda 表达式把函数看做对象,可以赋值给变量与作为参数传递。
[capture](parameters)->return-type{body}
// 如
[](int x, int y){ return x < y; }
[]{ ++global_x; }
[](int x, int y) -> int { int z = x + y; return z + x; }
// [capture]
[x, &y] // x 以传参方式传入,y 以引用方式
[&] // 任何被使用到的外部变量都以引用方式引用
[=] // 任何被使用到的外部变量都以传参方式引用
[&, x] // x显式地以传值方式加以引用。其余变量以引用方式加以引用
数学运算
c++ 内置数学函数(如 cos
,sin
,tan
,log
,pow
,sqrt
,abs
,fabs
,floor
),需要引用数学头文件 <cmath>
随机数生成,引用头文件 <ctime>
数组
type arrayName [arraySize];
type arrayName [size1][size2]...[sizeN];
type arrayName [arraySize] = { initialized list}
// 例子
double balance[] = {1., 2., 100.34}
// 如下等同
int a[3][4] = {
{0, 1, 2, 3}, /* 初始化索引号为 0 的行 */
{4, 5, 6, 7}, /* 初始化索引号为 1 的行 */
{8, 9, 10, 11} /* 初始化索引号为 2 的行 */
};
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
数组传递给函数
int func(int *a);
int func(int a[10]);
int func(int a[]);
int func(int a[][4]);
int func(int (*a)[4]);
typedef int parr[4];
int func(parr *p);
函数返回数组
字符串
-
C 风格字符串
字符串函数:
strcpy
,strcat
,strlen
,strcmp
,strchr
,strstr
字符串连接也可用 +
-
C++ 中的 String 类
指针
引用
把引用作为函数参数
把引用作为函数返回值
int arr[] = {1, 2, 3};
int& func(int i) {
return arr[i];
}
int main() {
func(1) = 4; // 函数返回 arr[1] 的引用,从而使得 arr[1] 的值变为 4
}
日期时间
#include <ctime>
int main() {
time_t now = time(0); // 当前系统的时间
char *dt = ctime(&now); // 转换为字符串形式
tm *gmtm = gmtime(&now); // 转换为 tm 结构(格林尼治标准时间)
dt = asctime(gmtm); // 获取时间字符串
tm *lctm = localtime(&now); // 转换为 tm 结构(当地时间)
int year = 1900 + lctm->tm_year;
int month = 1 + lctm->tm_mon;
int day = lctm->mday;
int wday = 1 + lctm->wday; // 周几
int hour = lctm->tm_hour;
}