的重载。 当extern不与”C”在一起修饰变量或函数时,如在头文件中: extern int g_Int;它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块引用其他模块中的定义,记住它是一个声明不是定义,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。这样的用处还是有的,就是在程序中取代include “*.h”来声明函数,在一些复杂的项目中,我比较习惯在所有的函数声明前添加extern修饰。
1、extern 和 static
(1)extern 表明该变量在别的地方已经定义过了,在这里要使用那个变量。
(2)static 表示静态的变量,分配内存的时候,存储在静态区,不存储在栈上面。
static 作用范围是内部连接的关系, 和extern有点相反。static与extern是一对“水火不容”的家伙,也就是说extern和static不能同时修饰一个变量。
2、extern 和const
C++中const修饰的全局常量据有跟static相同的特性,即它们只能作用于本编译模块中,但是const可以与extern连用来声明该常量可以作用于其他编译模块中, 如extern const char g_str[];
1.10 template
声明一个模板、模版的特化或显式实例化。模版用于打破类型系统的某些限制,推迟类型检查到实例化得到具体的模版实例进行以复用代码,实现泛型和参数化编程。
1.11 this
this是一种实体,仅在类的非静态成员中使用,是指向类的对象的指针右值。
1.12 typedef
用以给数据类型取别名。字面名义上是定义,实际是声明,这点和C语言的说法不同。
1.13 typeid
获取表达式的类型,以std::type_info表示结果,可能抛出std::bad_typeid。当操作数非多态类(引用)类型在编译时即可确定结果,否则需要在运行时取得结果,即RTTI。
从名字直观看来,该关键字应该是获取语言元素的类型ID。其实它和sizeof类似,是一个类型运算符。有时候代码可能需要获取某个变量或者类型的名字,这时候使用typeid就比较合适。
使用格式:typeid(int)或typeid(i+1)
这样操作后返回有个type_info类型的对象,比较常用的对象成员函数一般有比较是否相等和获取类型名。
1.14 typename
告诉编译器一个嵌套的限定名(包含::)中的未知的标识符是一个类型。这只在模板中需要区分依赖名称时使用。另一种用法是在模版声明参数列表中表示模版类型参数,可被class代替。
1、第一种情况是在函数模板和类模板声明中
一般模板声明中,使用class关键字指定类型参数,后来C++支持使用typename代替class关键字。这里仅仅是在语义上强调模板使用的类型参数不一定是类类型,可以是所有类型。这里typename和class没有任何区别。使用格式:
template
和
template
完全等价!
2、第二种情况使用情况比较特殊
简单说起来就是在使用类内成员类型的时候。类内成员类型就是在类定义内声明了一个类型,该类型属于类型内部,可见性由权限访问符限定。使用格式:
typename T::MyType * pvar;和typedef typename T:: MyType MyType;
1.15 asm
用于语法:
asm-definition: asm ( string-literal );
意义由实现定义,典型实现中传输其中的字符串给汇编器。
1.16 auto
在C++98/03中这个这个关键字用于声明块中的变量的生存期为自动生存期,若是对象同时具有自动存储类,即生存期在块结束时结束。这样的变量被称为局部变量。这个关键字不常用,因为即便省略,声明的默认就是auto的。
在C++11中,auto的含义改变为自动通过初值符推断声明的类型占位符。如声明auto i = 1;,auto就相当于int,因为1是int类型,可以推断出i的类型。也可以使用auto& i等声明,具体推导规则同模版参数类型推导。
1.17 *_cast
显式类型转换,C++延续了C风格的强制类型转换的语法。dynamic_cast是动态的,需要运行时支持;其它都是静态检查,相比C风格的类型转换更加细化,增强了类型安全性。C++支持四种关键字对不同形式的类型转换进行分别处理。使用格式:
转换关键字<类型>(表达式)
1、static_cast和C风格类型转换功能完全相同,它属于在编译时期静态的类型转换。如果把一个double类型转换为整形,形式如下:
static_cast
(0.1);
static_cast功能有所限制,比如不能转化struct类型到int,不能转化指针到double等。另外,它不能在转换中消除const和volatile属性。
2、const_cast用于消除引用或者指针的const或者volatile属性。
const int &ci=100;
int &i=const_cast
(ci);
通过这种方式,ci引用的内存单元虽然无法通过修改ci改变,但是可以修改i改变内存的值。这里是把const属性消除,这里想多说一点的是把const加上的问题。
3、dynamic_cast一般出现在类到子类或兄弟类的转换,并要求基类有虚函数。而且它能提供转换后的结果和状态,一旦转换失败则返回空指针。如果没有继承关系的转换一般使用static_cast。
4、reinterpret_casts一般用作函数指针的转换,而且使用它的代码可移植性很差,因为无法确定编译器的函数调用方式等。有可能会导致函数调用出错,一般不常用。
1.18 explicit
explicit关键字只能用于修饰只有一个参数的类构造函数,它的作用是表明该构造函数是显示的,而非隐式的,跟它相对应的另一个关键字是implicit,意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)。
explicit关键字只对有一个参数的类构造函数有效,如果类构造函数参数大于或等于两个时,是不会产生隐式转换的,所以explicit关键字也就无效了,而除了第一个参数以外的其他参数都有默认值的时候,explicit关键字依然有效。
除非有心利用,隐式转换常常带来程序逻辑的错误,而且这种错误一旦发生是很难察觉的。原则上应该在所有的构造函数前加explicit关键字,当你有心利用隐式转换的时候再去解除explicit,这样可以大大减少错误的发生。
隐式转换的含义:在C++中,如果的构造函数只有一个参数时,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象。也就是说CxString string2 = 10;这段代码,编译器自动将整型转换为CxString类对象,实际上等同于CxString string2(10);
1.19 export
导出模版,用于分离编译。C++11废除了这个export关键字的含义,但保留这个关键字。
1.20 register
提示声明的对象被放入寄存器中以便得到更好的性能。同inline类似,并非强制;不同的是这个提示经常被现代的编译器无视,因此C++11中被标记为过时的。