1、
const 修饰普通变量
const修饰一个变量,意思就是这个变量是一个常量,不能被改变
const int x; //x是一个整形常量
const double x; //x 是一个double型常量
const 修饰的是一个指针时:
const int *x; //x 是一个指向常量整形的指针
int *const x; //x 是一个常量指针。
const int *const x ; //x 即是一个常量指针,也指向一个常量
x在*右边就表示是一个常量指针 , 在*左边就表示指向一个常量。
STL中的迭代器是以指针塑模出来的 , 所以迭代器的作用和T *差不多。
当我们用 const 去修饰一个迭代器时:
const vector<int>::iteator it; //it是一个常量的迭代器,不能改变这个迭代器的指向,但能改变这个迭代器指向的值。
如果需要迭代器指向的东西不能被改动,如下:
vector<int>::const_iterator it;
2、
const修饰函数形参
<span style="font-size:14px;">int &fun(const int x);</span>
<span style="font-size:14px;"></span> <span style="font-size:14px;">函数的形参是一个普通的const变量: 1、 如果函数返回值一个non-const引用 , 那么就不能返回 x; 2、 x 的值在函数中不能被改变 , 非常量指针不能指向它 , 非常量引用也不能引用该变量。</span>
<span style="font-size:14px;">int &fun(const int x) { int *z = &x; //错误的 int *const z1 = &x; //错误的,因为z1不是一个指向常量的指针 const int *z2 = &x //正确的 int &z3 = x; //错误的, 因为z3不是一个常量引用 const int &z4 = x; //正确的 return x; //错误的 , 不是一个常量引用 }</span>
如果形参是 const指针 或者 const引用 , 和上面的普通常量变量用法一样。
3、const修饰成员函数
注意:只能成员函数才能被 const修饰 , 其他函数都不能被const修饰。
const修饰后的成员函数的注意点:
1、 在const成员函数中 , 类中的所有变量都含有const属性 , 而指针的const属性 , 是指指针本身是一个常量指针。
2、 因此在const成员函数中 , 不能non-const引用和non-const指向 ,类中的变量(除引用指针所指的值)
3、 两个成员函数如果只是常量性不同,是可以被重载的。
<span style="font-size:14px;">class xy { public: xy():z(new char[10]) {} xy(char *new_z) { int n = strlen(new_z); z = new char[n+1]; strcpy(z , new_z); } const char &operator [](int si) const; char &operator [](int si); private: char *z; int x; double y[10]; }; const char &xy::operator[](int si) const { cout<<"const"<<endl; return *(z+si); } char &xy::operator[](int si) { cout<<"no-const"<<endl; return const_cast<char &>( static_cast<const xy&>(*this)[si] ); } </span>
在类中 , 经常出现通过const属性重载的两个函数,如果这两个函数功能完全一样,那么我们为了避免代码重复,往往都会让non-const 版本的函数去调用 const版本的函数
如上面例子中的 operator[] 函数。
这个时候就要用到const_cast 和static_cast两个强制转行的类型
const_cast:去除变量的const属性。
const int x;
int &y = const_cast<int &>(x);
static_cast: 普通变量之间的强制转换、给一个变量添加上const 属性
int x;
double y = static_cast<double>(x);
c++中const用法大全