目录
1 const关键字
1.1 成员变量
const成员变量初始化方式:
- 构造函数初始化列表中进行初始化
- 将const成员变量用static修改,在类外初始化
1.2 const成员函数
class A{
public:
void test() const {
std::cout << "const func" << std::endl;
}
};
- const成员函数只能读取成员变量,不能修改
- const对象只能调用const成员函数;非const对象也可以调用const成员函数
- 成员函数可以通过是否有const来实现重载
2 mutable关键字
被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中,主要修改一些跟类状态无关的数据成员
class A{
public:
void test() const {
count += 1; // 正确,因为count为mutable变量
std::cout << "const func" << std::endl;
}
private:
mutable int count;
};
- 被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中,主要修改一些跟类状态无关的数据成员
3 volatile关键字
声明的变量编译器对访问该变量的代码不再进行优化,总是从它所在的内存(而不是缓存)读取数据。主要引用于多线程并发访问共享变量、内嵌汇编操纵栈等
内存屏障(memory barrier):保证指令的执行顺序,内存屏障前的指令一定先于内存屏障后的指令,防止cpu和编译器因为优化而对指令重新排序,主要用于多线程。
volatile int a = 10; // 阶段A
int b = a;
..... // 其它一些操作
int c = a; // 阶段B。此时编译判断阶段A到阶段B之间没有对a进行更新操作,会将上次获取a的值赋值给c,但由于a是volatile修饰,所以会重新从a对应的内存获取值
- volatile可以保证对特殊地址的稳定访问
4 static关键字
- 类的静态成员函数不能直接访问类的非静态成员,可以通过传参的方式获取对象名,然后调用非静态成员
- this指针是一个特殊的隐含指针,它隐含于成员函数,除静态成员函数外每个成员函数都有一个this指针,this是通过函数参数的首参来传递的
5 using关键字
- 命名空间使用,防止不同文件的代码出现命名冲突
- 子类中引用基类中不能直接访问的成员
- 指定别名,常用于函数指针,类似typedef,C++11引入
6 sizeof关键字
不是函数,是一个操作符,sizeof(i++)不会执行i++这个表达式。对于空类,结果是1,为了占位
7 nothrow关键字
c++异常处理需要额外多出20~30ms的时间,nothrow使得new运算不会抛出异常,而是返回NULL。对应头文件#include <new>。只能保证operator new不抛出异常,不保证构造函数抛出异常
char* p = new (std::nothrow) char[1048576];
8 explicit构造函数
为了防止隐式转换,如class test{ public: test(int n); },此时 test a = 32是正确的, 构造函数加了explicit不允许这种写法
9 operator new
c++内存管理例程,operator new内含一个无穷循环,尝试分配内存,若无法满足内存需求,就调用new-handler分配,可以用set_new_handler重新设置new_handler处理函数,且能处理0字节申请,最终分配失败会抛出bad_alloc异常。
10 operator delete
收到null指针时不做任何操作
11 RAII
资源取得时机便是初始化时机