C++语言基础
2019-08-16 本文已影响0人
this_is_for_u
extern关键字作用
1.extern置于函数或者变量前,声明这个函数或变量,可以在本地模块使用,但定义在其它模块,需要和其它模块一起链接。
2.extern "C",经常能够看到在函数前包围这种extern c之类,是为了告诉编译器在编译该函数时以c方式编译,编译生成的符号不像c++一样带前后缀(以为C++为了支持多态,不同编译器添加符号不同),而是保持函数本来面目。
static关键字
无论是static成员变量、static局部变量、static全局变量内存都是分配在全局数据区。
- static成员变量:作用域为当前类,需在类外初始化(const static 貌似c++11不需要类外初始化),统一一下还是都类外初始化比较好。
- static局部变量:作用域为当前函数,只初始化一次,分配在全局数据区
- static全局变量:作用域为当前文件,在头文件中定义static,引用此头文件的都会有该static变量的一份拷贝,静态变量不能被其它文件所用,即不能配合extern使用
- static成员函数:可以避免和全局函数符号冲突,static成员函数只能访问static变量,不能访问非static成员函数和变量
- static全局函数:只在声明它的文件中可见,不能被其它文件使用。
volatile关键字
一般使用volatile可以避免编译器做一些优化
int *p = xxx;
int a = *p;
int b = *p;
a和b都等于p指向的值,一般编译器会对此做优化,把*p的值放入寄存器,之后a和b都等于寄存器的值,但是如果p地址的值是动态改变的,这就不符合需求,所以在此对p加volatile修饰可以避免进行此优化
另外volatile基本不能解决多线程问题,多线程问题还是需要依赖原子操作和锁
const关键字
Wrapper当作一个自定义class
const 常量:const int kValue = 10;//不可更改
const 引用: void func(const Wrapper& w);//w不可更改
const 对象: const Wrapper w;//w对象只可以访问const成员函数
const成员函数: Wrapper::func() const;
const 指针:char * const; const char *;从右向左读即可知含义
在c++11后可以使用std::decay<T>::type忽略T的cv属性。
memmove vs memcpy
代码说话,memcopy对于重叠内存的行为是不可预计的,而memmove可以更好的处理这种情况,所以一般情况下memcopy效率高于memmove。
char[] str = "helloworld";
memcpy(&str[3], &str[4], 4); // undefined behavior
memmove(&str[3], &str[4], 4); // fine behavior