现在的位置: 首页 > 综合 > 正文

C++限定符总结

2013年08月11日 ⁄ 综合 ⁄ 共 2002字 ⁄ 字号 评论关闭
概念:
连接:在一个执行程序中,标识符代表存放变量或者被编译过的函数体的存储空间。连接用链接器所见的方式描述存储空间。连接的方式有两种,内部链接和外部链接:
内部链接意味着只对正被编译的文件创建存储空间。用内部链接,别的文件可以使用相同的标识符或全局变量,链接器不会发现冲突——也就是为每一个标识符创建单独的存储空间。在C和C++众内部链接由关键字static指定。
外部链接意味着为所有被编译过的文件创建一片单独的存储空间。一旦创建存储空间,链接器必须解决所有这片存储空间的引用。全局变量和函数名有外部链接。通过用关键字extern生命,可以从其他文件访问这些变量和函数。函数之外定义的所有变量(C++中除了const,const 默认为内部链接,明确的声明可以改变为外部链接)和函数定义,默认为外部链接。局部变量只存在对战中,所以没有链接。

1、Static
静态变量作用范围在一个文件内,只有本文件内的代码才能访问它,它的名字在其它文件中不可见。程序开始时分配空间和初始化,结束时释放空间,使用时可以改变其值。实现的时候不需要static的修饰,因为static是声明性关键字;
static关键字是C,   C++中都存在的关键字,   它主要有三种使用方式,   其中前两种只指在C语言中使用,   第三种在C++中使用(C,C++中具体细微操作不尽相同,   本文以C++为准).   
 (1)局部静态变量 :全局数据区分配内存,只初始化一次,全局生命期
 (2)外部静态变量/函数 :不能被其它文件访问的全局变量和函数,但为了限制全局变量/函数的作用域,
 (3)静态数据成员/成员函数:表示属于一个类而不是属于此类的任何特定对象的变量和函数. 
2、extern
extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,它告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。
1。对于extern变量来说,仅仅是一个变量的声明,其并不是在定义分配内存空间。如果该变量定义多次,会有连接错误
2。通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。也就是说c文件里面定义,如果该函数或者变量与开放给外面,则在h文件中用extern加以声明。所以外部文件只用include该h文件就可以了。而且编译阶段,外面是找不到该函数的,但是不报错。link阶段会从定义模块生成的目标代码中找到此函数。
3。与extern对应的关键字是static,被它修饰的全局变量和函数只能在本模块中使用。

以下三个关键字是相关的,其中const-volatile也被合称为c-v限定符。
3、volatile
volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。同const一样,volatile是一个类型修饰符。
4、const
限定一个变量(所有变量,包含:成员变量,参数变量,局部变量,全局变量,返回值)不允许被改变。const限定中最麻烦的是可能是指针的限定,需要多加关注。与const对应的关键字是mutable。
5、mutable
用于类的非静态非const数据成员,表示不受到成员函数的const的限制,可以在const成员函数中使用。

下面试其他函数限定符
6、inline
inline只会影响函数在translation unit(可以简单理解为C源码文件)内的编译行为,只要超出了这个范围inline属性就没有任何作用了。所以inline关键字不应该出现在函数声明
中,没有任何作用不说,有时还可能造成编译错误;
inline关键字仅仅是建议编译器做内联展开处理,而不是强制。
7、explicit
这个关键字修饰构造函数声明,表示显式构造函数(模版),显式构造函数不参与特定的重载。C++11从两个角度扩展了用法。其一是适用于转换函数(模版),类似构造函数,避免不需要的重载。其二是列表初始化,除非直接使用std::initializer_list,显式构造函数被列表初始化忽略(在C++98/03中,explicit仅对单一参数调用构造函数有意义,这里打破了这个限制)。

参考:
《C++编程思想 第1卷:标准C++导引》

转载请注明原载地址:http://blog.csdn.net/xinhanggebuguake

抱歉!评论已关闭.