Mutable&const&volatile&extern&Static

1、Mutable

使用mutable关键字后,即使上下文环境在const函数中,或者当前为const对象,也可以修改被修饰的值

Mutable int counter;

2、const&volatile

const修饰的值不能被当前程序上下文修饰,但是可能在其他环境中被修改,如系统

volatile(基于多线程的考虑)修饰的变量在每次访问的时候都要去相应的内存地址取值,因为随时可能改变

这两个关键字同时修饰的时候并不矛盾,顺序也不重要


例如:

unsigned char flag = 1;

int main(int argc, char **argv) {

reg_intr(XXX, intr_func);

while(flag){

printf("hello\n");

}

return 0;

}

void intr_func(void) {

flag = 0;

}

unsigned char flag不加volatile时,编译器会优化处理将while条件中flag的值1放在缓存中,每次都从缓存中取,因此循环会一直运行

当加上volatile后,每次取值都直接取对应地址上的值,那么当发生reg_intr(XXX, intr_func);这个事件时,就会改变flag值,那么就会去到改变后的值,最后退出while循环

3、const

http://blog.163.com/lee_020/blog/static/1247556020120235742444/ const的思想

const并不能把变量变成常量,只是表示不能通过这个被const修饰的符号来修改这个符号对应值,但是并不能防止我们通过其他方法来修改这个值

<1>重载和覆盖:

(1)重载时加上表示同一函数,但是两个函数可以并存,因为const对象不能调用非const函数(这个很重要)

(2)覆盖(多态),则表示不同的函数(参数类型不同),这时达不到多态效果

<2>限定变量:

(1)把一个对象转换成一个常量,声明的时候需要初始化,赋值后不能再次赋值了

(2)在全局作用域声明的变量在整个程序中都可以被访问,但是加了const修饰后却是定义该对象文件的局部变量,只能存在于这个文件中,不能被其他文件访问(没有添加extern的情况下,这个类似static修饰的全局变量,加上extern就可以被其他文件共享)

如:

file_1.cpp:extern const int counter = 100;

file_2.cpp:extern const int counter;++counter;

   <3>

       class A
                  {
                       ......
                       void f(int i) {......} file://个函数
                       void f(const int i) {......} file://error
                       ......
                   };

    按值传递时,对用户而言,这是透明的,用户不知道函数对形参做了什么手脚,在这种情况下进行重载时没有意义的,所以规定不能重载;当指针或引用被引入时,用户就会对函数的操作有一定的了解,不再是透明的了,这时重载是有意义的,所以规定可以重载

<4>可以节省空间

(1)#define 定义的常量在编译期间替换,并分配内存,而且每次替换都要分配内存,相当于立即数

(2)const定义的常量声明时并未放入ROM中,而是放入了符号表中,在第一次用的时候分配内存,以后就不再分配内存了,相当于取地址

4、extern

<1>extern用于函数定义,表示全局

<2>extern用于变量,表示在其他地方定义

5、Static

<1>static成员的内存空间不在类的实例中,而是像全局变量一样在静态存储区,被所有类对象共享

<2>static数据成员的初始化放到类的外面

<3>static在函数内部,表示该变量的值在各个调用期间一直保持延续性。在函数这一级,表示函数对本文可见

   <4>static修饰的全局变量(或者函数):只能在本文件中使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章