模板

作用:一次编写,多场景复用

1
2
3
4
5
6
7
8
9
template <typename T>//具体值可以写任意不冲突的标识符
class Vector {
T*date;
size_t size;
public:
Vector() : data(nullptr), size(0) {}
Vector(size_t n) : data(new T[n]), size(n) {}
~Vector () {delete[] data; }
};

修饰词

作用:限定或改变变量,函数,类,对象等行为或属性的关键字或符号

const 只读,不可修改(对象,指针,指向const的指针,引用,成员函数,对象)

​ 作为函数参数时,额外支持了字面量或临时对象的传递,原本用普通的引用传参编译是无法通过的,因为函数内部修改并没有实参变量来承载

​ 在成员函数中,如果函数加上const修饰,那么函数中就无法修改成员变量

mutable 可变的

constexpr 修饰的变量才是真正意义上的常量

static 在函数内变量前加上static修饰等价于将这个变量开到全局,但是只能在函数内访问;在类的成员变量中定义也是开在全局,不占用对象的内存,初始值需要在全局通过类名和作用域解析运算符来给予。特点是所有的对象共享这个静态成员变量,也就是说,它是属于类的,而不是属于对象的,全局独一份,也能通过类名直接访问。还能作用于成员函数

inline 修饰函数,表示内联函数,在调用时会直接展开,省去函数调用的开销,性能会更高

预处理器

定义:在正式编译前,预先对代码进行处理

#include

#include <iostream>代表从标准库中查找文件

#include "myheader.h"代表先从同目录中找,找不到再从标准库中查找

例如多文件联合编译时就需要使用引号,当然多文件编译还涉及到编译指令的修改,可以学习makefile或者cmake相关知识

宏定义

#define PI 3.14159265 定义常量

#define SQRT(x) x * x 还可以传参数

#define OUT(n) cout << #n;通过#加参数直接获取到这个参数的标识符

宏定义还可以使用多条语句,使用\进行换行,将反斜杠连接的内容都作为宏定义的一部分,但注意在条件语句中使用宏,如果不加花括号,只有一个语句会被包含在控制语句当中

1
2
3
4
5
6
7
#define OUT(n) cout << #n;\
cout << ": "; \
cout << n << endl;
//可以使用do while将其作为一个整体
#define OUT(n) do {cout << #n;\
cout << ": "; \
cout << n << endl; } while(0)

#define RELEASE 单独定义一个标识符,结合条件预处理器使用

#ifdef #ifndef #if #elif #else #endif

1
2
3
4
5
6
#define RELEASE
#ifdef RELEASE
cout << "RELEASE" << endl;
#else
cout <<"DEBUG" << endl;
#endif//#endif 代表头文件的结束