今天看书看到一个 const char * const * array; 登时眼就晕了...
后来仔细分析分析, 又加以自己的乱加推测, 算是搞明白了~~
const 就是拿来声明常变量的, 被声明的那些值不可以被改变,若尝试改变之,编译器就不干了
int non_const_ival = 10; int another_non_const_ival
const int const_ival = 10; int const const_ival = 10; // val 常量为整型常量 将val 看做一个变量,val的值是不可以被改变的。
const int *pival = &non_const_ival; int const *pival = &non_const_ival;
// 这下子被声明为常量的就是 (*pival) 了, 故而(*pival) 便是不可改变的了, 然而 pival 却是可以改变的,
// 如: pival = &another_non_const_ival; 这是完全可以的, pival 指向新的数据, 同时 (*pival) 依然不可被改变
const int * const pival = &non_const_ival; int const * const pival = &non_const_ival;
// 上面的 从右往左考虑, 首先 const pival 说明 pival 是常量, 就是这个指针的值不可以被改变; 继续往左看
// 是说 (* const pival) 是常量, 也就是所指向的值不可被改变。 故而: pival = & another_non_const_ival; 非法
// 同时 *pival = 20; 也非法
其实就是把类型说明符去掉后 const 右边的一大堆整体 是常量; 要么是指针 要么是 (*指针) 或者更高级的指针,像开篇那里的:
const char * const * array ; // 二级指针
// 首先 const * array; 说明array指向的 一个指向字符串的指针数组 的值不可被改变
// 其次 const **array; 说明 (**array) 不可被改变, 就是字符串不能被篡改;
class Test { int ival; };
类里面的 const:
const Test Test::add ( const Test & rhs) const // 类的成员函数
{
Test temp;
// ......
return temp;
}
// 右边的 const 限制这个函数体内 不可以对调用这个函数的 对象进行任何更改, 就是 私有变量 ival 的值不可改变
// 中间的 const 限制作为引用形参传递过来的 对象 不能被篡改 rhs.ival 值改变就非法
// 左边的 const 是指 返回的值不可以被篡改, 如下:
Test t1,t2,t3;
t1.doIt( t2) = t3; // 返回的值 被篡改, 非法了, 虽然一般不会这么些...
归根结底就是在声明变量时, const 右边的一大堆那个整体 是常量;
阅读(2081) | 评论(3) | 转发(0) |