Skip to content

C++ Basics

命名空间

定义:

namespace name {
    // variables, functions, classes, typedef, #define
}
// Examples:
namespace Li {
    int count;
}

使用方法一:使用域解析操作符::

Li::count = 1;  

使用方法二:使用 using 关键字

using Li::count;
count = 1;
using namespace Li;
count = 1;

数据类型

基本内置类型:bool, charintfloatdoublevoidwchart_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 类型

字符串常量:括在双引号中,可用 \ 对字符串做分行

常量定义:

#define identifier value
const type variable = value

修饰符类型

数据类型修饰符:signedunsignedlongshort

类型限定符:

  • const:执行期间不能被修改
  • volatile:编译器不需要优化变量,程序直接从内存汇总读取变量
  • restrict:修饰的指针是唯一一种访问它所指向的对象的方式

存储类

  • auto:声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符。c++17 已删除

    auto f=3.14;  // double
    auto s("hello");   // const char*
    auto z = new auto(9);  // int*
    
  • register:定义存储在寄存器中而不是 RAM 中的局部变量(已被弃用)

  • static:在程序的生命周期内保持局部变量的存在。若修饰全局变量,会使变量的作用域限制在声明它的文件内。用在类数据成员上时,会导致仅有一个该成员的副本被类的所有对象共享。

  • extern:提供一个全局变量的引用(用来在另一个文件中声明一个全局变量或函数)

  • mutable:允许对象的成员替代常量

  • thread_local:使用 thread_local 说明符声明的变量仅可在它在其上创建的线程上访问。

运算符

算术运算符:+-*/%++--

关系运算符:==!=><>=<=

逻辑运算符:&&||!

位运算符:&|^~<<>>

赋值运算符:=+=-=*=,……

杂项运算符:sizeofCondition ? X : Y.->int()&*

运算符优先级(高到低):

  • 后缀(括号,数组,成员访问)
  • 一元(从右到左)(正号,负号,否定,位否定,增量,减量,引用,取址,类型转换,sizeof
  • 乘除
  • 加减
  • 移位
  • 关系
  • 相等
  • 位与
  • 位异或
  • 位或
  • 逻辑与
  • 逻辑或
  • 条件(从右到左)
  • 赋值(从右到左)
  • 逗号

循环

循环类型:whilefordo... while

循环控制语句:breakcontinuegoto

判断

  • if,if...else

  • switch

    switch(expression) {
      case constant-expression:
          statement(s);
          break;
        // ...
      default:
          statement(s);
    }
    

函数

return_type function_name(parameter list) {
}

函数参数

  • 传值调用

    void swap(int a, int b);
    swap(a, b);
    
  • 指针调用

    void swap(int *a, int *b);
    swap(&a, &b);
    
  • 引用调用

    void swap(int &a, int &b);
    swap(a, b);
    

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++ 内置数学函数(如 cossintanlogpowsqrtabsfabsfloor),需要引用数学头文件 <cmath>

随机数生成,引用头文件 <ctime>

// 设置种子
srand((unsigned)time(NULL));
// 生成随机数
int j = rand();

数组

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);

函数返回数组

int *getArray() {
    static int arr[10];
    // ;
    return arr;
}

字符串

  • C 风格字符串

    char str[7] = "c"
    

    字符串函数:strcpystrcatstrlenstrcmpstrchrstrstr

    字符串连接也可用 +

  • C++ 中的 String 类

    string str1 = "runoob";
    string str2 = "google";
    string str3
    // 复制
    str3 = str1;
    // 连接
    str3 = str1 + str2;
    // 求长度
    int len = str3.size();
    

指针

int var;
int *p = &var;
*p = 10;
*p = NULL;  // 空指针
int *ptr1[10];  // 指针数组
int (*ptr2)[10];  // 数组指针

引用

int i = 17;
int& r = i;  // r 就是一个初始化为 i 的整形引用

把引用作为函数参数

void func(int &a);
int main() {
    int b;
    func(b);    // func 函数中对 a 的修改会作用到 b 上来
}

把引用作为函数返回值

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;
}

数据结构

struct type_name {
    member_type1 member_name1;
    member_type1 member_name2;
    // ...
} object_names;