跳转至

语法

define const

define宏是在预处理阶段展开,const常量是编译运行阶段使用

define只是展开,有多少地方使用,就展开多少次,不会分配内存

const可以节省空间,避免不必要的内存分配,C++里面应该只使用const不使用define


引用

引用即别名,对引用的所有操作都作用在其绑定的对象上,引用必须初始化

// 可以直接定义引用
int b = 1;
int &a = b;
a ++; // b == 2

// 对数组
int array[3][4];
int (&row)[4 = array[1]; // 将row绑定到array第二个4元素数组上

int (&row)[4]这里要加括号,表示对数组的引用,不加则变成了对引用的数组 (declared as array of references of type 'int &')

与此相似有

int *ip[4]; // 指针的数组
int (*ip)[4]; // 指向含有4个整数数组的指针

auto

要修改值,应该加引用

vector<int> v(3, 1);
for (auto &c : v) c ++; // {2, 2, 2}

同样,通过auto访问多维数组时,除最后一维前都要使用引用,因为编译器会将数组自动替换成一个指向数组首元素的指针,对int*的范围访问无意义,因此要使用引用来保持数组的概念


memset

头文件

#include <cstring> // 或 <memory>

static

作用在普通函数/变量上,主要作用是限制范围

static全局变量

  1. 在全局变量前加上 static 关键字,即为静态全局变量
  2. 静态全局变量在程序的全局区分配内存,若未初始化则默认初始化为0,直到程序结束才销毁
  3. 静态全局变量在该文件内可见,从变量定义处开始直到文件结束(普通全局变量在同一程序的其他文件中可见,默认是 external 属性,而静态全局变量是 internal 属性), 而在其他文件中不可见

如果static变量写在头文件中,引用该头文件的程序都会维护一个该变量,并不共享

static局部变量

  1. 在局部变量前加上 static 关键字,即为静态局部变量
  2. 静态局部变量也存储在数据区(不在栈区),程序执行之前就已分配内存,程序执行结束后才销毁
  3. 静态局部变量只在首次执行到声明处初始化一次,之后再执行该语句时不在初始化,若没有初始化则编译器会将其初始化为0
  4. 其作用域与局部变量的作用域一样,从定义处到所处语句块结束

static函数

  1. 在普通函数的返回类型前加上 static 关键字,即为静态函数
  2. 只能在本文件中使用

extern

extern关键字表明声明一个变量而非定义它

声明 使得变量名字为程序所知

定义 创建与名字关联的实体

extern int i;       // 声明i而非定义i
int j;              // 声明并定义j

extern的作用是多个文件可以共享一个全局变量,对其用extern来声明即可。变量能且只能被定义一次,但可以被多次声明

如果extern语句包含初始值,那么就不再是声明,而变成了定义,如下会有warning但可以编译通过

extern int num = 10; // 定义,抵消了extern的作用

在函数体内部,如果试图初始化一个extern标记的变量,将引发错误,如下

void f() {
    extern int num = 10;
}