const volatile mutable的总结

来源:互联网 发布:网络奇兵重制版 编辑:程序博客网 时间:2024/06/06 08:59

const
一.一般应用
1.const修饰各种变量的用法.
a.取代define
#define D_INT 100
#define D_LONG 100.29
………
const int D_INT = 100;
const D_INT = 100; //如果定义的int类型,可省略int.
const long D_LONG = 100.29;
………
const int& a = 100;
const替代define虽然增加分配空间,可它却保证了类型安全.
在C标准中,const定义的数据相当于全局的,而C++中视声明的位置而定.
b.修饰指针相关的变量
以三组简单的定义示意:
Group1:
int a = 0;
const int* b = &a;———— [1]
int const *b = &a;———— [2]
const int* const b = &a;—- [4]
Group2:
const char *p = “const”;————–[1]
char const *p = “const”;————–[2]
char* const p = “const”;————–[3]
const char * const p = “const”;—-[4]
Group3:
int a=0;
const int &b = a;—————[1]
int const &b = a;—————[2]
int & const b = a;————–[3] //—>修饰引用时,const被忽略
const int & const b = a;—–[4]
总结:
1.如果const位于星号左侧,则const用来修饰指针所指向的变量,
即指针指向的为不可变的.
2.如果const位于星号右侧,const就是修饰指针本身,即指针本身是
不可变的.
因此,[1]和[2]的情况相同,指针所指向内容不可变(const放在变量
声明符的位置无关),
这种情况下不允许对内容进行更改,如不能*a = 3 ;
3.[3]中指针本身是不可变的,而指针所指向的内容是可变的,这种情况
下不能对指针本身
进行更改操作,如a++是错误的
4.[4]中指针本身和指向的内容均为常量.(引用特殊:引用在使用增加
遇义时,增加它代表的变量.所以qualifiers on reference are ignoredv.
延伸点:
注意示例:
1.const int& reference = 1000;
2.char* p = “const”
char*& q ;
2.const在函数环境下的各种应用
常用法示例如下:
const A& _Fun(const A& _in); //修饰引用型传入参数
// A _Fun(const A& _in);
//A& _Fun(const A& _in);
//上面的两种,在函数内部有特殊的步骤,这里不详提了…..
const A* _Fun( const A* _in); //修饰指针型传入参数
void _Fun( ) const; //修饰class成员函数
const A& _Fun(A& _in ); //修饰返回值
const A & operator(const A& _in); //同时修饰传入参数和返回值

a.修饰参数
如void _Fun(const A* _in)或 void _Fun(const A& _in);
它们被修饰后,在函数执行期间行为特性同于上面的讲解,
注意:这不会改变原来数据的是否是const的属性.

b.修饰函数返回值
const A& _Fun( )
const A* _Fun( );
注意:由于生命期不同步的问题,不可将局部的变量的指针或引用返回(static除外).
另外,传出来的视情况,代表不同的意思…
对于A&返回类型,你若将之赋与其它变量,那么它实际执行的是将返回的变量
(或引用)代表的数据赋出..而你若将其它值赋予之,那么被赋予的是变量或引
用代表的数据. 而const A& 一般是防止之做为左值被赋值.

mutable(易变的)
mutable只能够用于一个类的非静态数据成员,明智地使用 mutable 关键字可以提高代码质量,因为它能够让你向用户隐藏实现细节,而无须使用不确定的东西,比如 const_cast<>。
如果尝试下面编译这段代码,你会得到一个编译错误。虽然 Redraw() 声明为 const,但是它修改了一个数据成员。解决这个编译错误的方法是将 isLoaded 声明为一个 mutable 数据成员:

class Image{public: int Redraw() const; //..private: mutable bool isLoaded;//can be changed by a const function};

volatile
volatile的本意是“易变的”,volatile关键字是一种类型修饰符,用volatile
关键字告诉编译器不要持有变量的临时拷贝,使用这个变量是必须重新从变量所在内存中读取数据,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量。
思考:
1). 一个参数既可以是const还可以是volatile吗?解释为什么。
2). 一个指针可以是volatile 吗?解释为什么。
3). 下面的函数有什么错误:

 int square(volatile int *ptr)   {        return *ptr * *ptr;   }``` 1). 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。    2). 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。    3). 这段代码的有个恶作剧。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:<div class="se-preview-section-delimiter"></div>

int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
“`

参考资料:
1.http://www.blog.csdn.net/wuliming_sc/article/details/3717017.html
2.http://www.cnblogs.com/skyfei/archive/2006/08/23/484251.html
3.http://www.stackoverflow.com/questions/2444695/volatile-vs-mutable-in-c.html

0 0
原创粉丝点击