const记录

const最常用的是定义一个常量,用来代替#define的部分功能,因为#define只是单纯的文本替换,而const的变量会由编译器进行类型检查,更加安全。而且#define 会造成代码膨胀,而const常量在内存中只有一份拷贝。

注意const int *p,int const *p,int *const p各自的含义,前两个是一致的:p是一个指针,指向一个const int对象,最后一个意思是,p是一个常量,这个常量是int*类型的。

重载operator*操作符时,可以返回一个const值,这是为了防止出现(a*b=c)这样的式子,对匿名对象赋值没什么意义。返回const值可以防止将(a*b==c)这样的判断式误写为(a*b=c)

const另一个用途是修饰成员函数,这使得操作const实例对象成为可能。在const成员函数中可以调用非const成员函数,而非const成员函数中也可以调用const成员函数,因为在一个成员函数中调用另一个成员函数本质上是通过"this->"这样来调用的,如果当前是在const成员函数中,这个this指针具有常量性,可以通过const_cast<>去除this指针常量性,然后

“this->"就可以调用非const成员函数了。在非const成员函数中,则通过static_cast<const& T>将this指针所指之物添加上常量性,然后就可以调用const成员函数。这样做可以避免某些重复代码,但一般原则是只能在非const成员函数中通过上述方法调用const成员函数,因为const成员函数必须保证不改变实例中non-static成员变量的值。此外mutale修饰符也是一种手段。

类中const成员变量和引用变量必须通过构造函数初始化列表进行初始化。函数传值时使用const T&这样的传值方式可以大大提高效率。

======================================================================================================

 const和volatile一起使用并不矛盾。const表示本程序段不该去改变某个变量值,但在多线程环境下,这个变量可能会被其他程序修改。

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int i=8;
 6     const int* p=&i;
 7     i=9;
 8     cout<<*p<<endl;
 9     return 0;
10 }

以上代码输出是9,可以想象,如果i是一个全局变量,多个线程均可访问i,那么i可能会被改变,即使在某个线程中,是用const int *p来引用变量i。

posted @ 2016-04-05 12:43  vaevaevae  阅读(112)  评论(0编辑  收藏  举报