Mutable&const&volatile&extern&Static

一、Mutable

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

Mutable int counter;多线程

二、const&volatile

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

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

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


例如:spa

unsigned char flag = 1;线程

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

reg_intr(XXX, intr_func);对象

while(flag){blog

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循环

三、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中,而是放入了符号表中,在第一次用的时候分配内存,之后就再也不分配内存了,至关于取地址

四、extern

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

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

五、Static

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

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

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

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

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息