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。