C++里面有不少知识点是与其本身的关键字紧密结合的。本文即讲到了常用的const、static、ref、enum,也会介绍一些不太常用或者一些较新的关键词:extern、volatile、auto、decltype、constexpr、explicit,最后再附带介绍了一下C++正则regex方面的知识。这里注意ref包括左值引用、右值引用两大部分,其中右值引用一般较少见。
目录:
const
const是constant的缩写,顾名思义——常量。
在商业化编程中,熟练使用const是一门必要的基本功。它的主要使用场景有两大部分,
- 修饰变量或者参数,使其达到某个常量目的;
- 与类相结合。
修饰变量
一种最普遍是使用方式,const修饰变量,这样将无法再次修改该变量的值。
int const a = 1;
//a = 10; //error
然而,最恼火的是指针的出现,伴随着一串const与pointer的结合。心中一万只野马在奔腾。
const int* c_ptr = &c;
int const* c_ptr2 = &c;
int* const c_ptr3 = &c;
const int const* c_ptr4 = &c;//warning C4114
const int* const c_ptr5 = &c;
初次见到上面这4行代码。如果不是对const十分熟悉的话,十有八九会搞晕。针对这种情况,极为有必要实践并做处相关的笔记。
首先,准备了几个备用变量。
int const a = 1;
int const b = 2;
int c = 10, d = 20;
接下来,就陆续给出实践结果。
实践1: const int* c_ptr = &c;
const int* c_ptr = &c;
//*c_ptr = 11; //error
c_ptr = &d;
结果:*c_ptr 值是常量,c_ptr指针可以修改。
实践2:int const* c_ptr2 = &c;
int const* c_ptr2 = &c;
//*c_ptr2 = 12; //error
c_ptr2 = &d;
结果:*c_ptr 2值是常量,c_ptr2指针可以修改。(也就是说实践1与实践2,两种写法是一样的效果),那么,继续看….
实践3:int* const c_ptr3 = &c;
int* const c_ptr3 = &c;
//c_ptr3 = &d; //error
*c_ptr3 = 13;
结果:c_ptr3指针是常量,*c_ptr3值是可以修改的。(同以上2种实践结果恰好相反)。继续…
实践4:const int const* c_ptr4 = &c; //warning C4114
const int const* c_ptr4 = &c;//warning C4114: 多次使用同一类型限定符
//*c_ptr4 = 14; //error
c_ptr4 = &d;
结果:*c_ptr 4值是常量,c_ptr4指针可以修改。该写法被给予了警告:warning C4114: 多次使用同一类型限定符,同时也可以看出这种写法的效果和实践1、2是一致的,直接使用实践1或者2的写法就完全可以,并且不会出现警告。
实践5:const int* const c_ptr5 = &c;
const int* const c_ptr5 = &c;
//*c_ptr5 = 15; //error
//c_ptr5 = &d; //error
结果:*c_ptr 5值是常量,c_ptr5指针也是常量。这种修饰方式十分稳定,任何内容都是无法修改的。
小结:观察了这5组实践,很快就得出结论了。去掉类型,一眼就能知道谁是常量、谁是可以修改的。举个栗子吧,
e.g.
const int* const c_ptr5 = &c;
去掉类型,
const * const c_ptr5 = &c;
第一个const后面修饰的是 *c_ptr5;第二个const修饰的则直接是c_ptr5。如此下来,就将整个内容全部表示为常量了。以此类推,相信很容易解释其他几个实践了。
与类结合
与类结合之后,可能会面临两个问题,
- 修饰某个函数&#