C++中有关const的一点心得
水晶扇 QQ: 282974362
1 指向const的指针和const指针
- 指向const的指针
① 指向const的指针是指无法通过此指针修改其指向的数据(有可能通过别的方法修改),指针本身可以改变。
② 指向const的指针定义方式有三种: ①const type * p; ②type const * p; ③const type const * p。
③ 指向const的指针做加减整数得到的新指针仍然是指向const的指针。【可称为“自以为指向const的指针”】 - const指针
① const指针是指无法改变指针本身,但其指向的数据可被改变。
② const指针定义方式为:type * const p。
③ const指针做加减整数得到的新指针不再是const指针,而是普通指针。
2 const变量的存储
- VC++6.0
2.1 const变量被强制改变
const变量被强制改变后,其地址对应的值会改变,但是const变量本身代表的值不变(这只是编译器的一个小小优化)(简单类型,int,char,bool优化;复杂类型float,double不会优化)。
常变量本身分配内存,但是使用时用常数替换;对其取地址,获取到的是给const变量分配的地址(常变量本身并不使用这个地址)。如果把指向该地址的指针强制转化为非const的指针,然后改变该内存里面的值,则该内存值会改变,但是原来的常变量本身值不变。如下图:
2.1 const数组被强制改变
常量数组值被强制改变后,原来常数组值也会改变。(复杂类型的const变量也是)
- G++
2.1 const变量被强制改变
G++不但优化了简单类型,int,char,bool;还优化了复杂类型float,double。
2.2 const数组被强制改变(不允许)
G++中,如果将常数数组指针强制转化为普通指针(使用const_cast),使用该指针仍然不能改变数组内的值。会报段错误。
3 函数const参数
3.1 普通形参与const形参
在函数的参数列表中,const形参与普通形参是等价的。如:
void fun(int t);
void fun(const int t);
上述两个函数申明被认为是申明同一个函数。
3.2 普通引用形参与const引用形参
① const引用参数与普通引用参数是不同的。
void fun(int& reft); // a
void fun(const int& reft); // b
上述两个函数声明是不同的函数声明。
② 如果传入的是非const变量或非const引用,则自然调用a函数
③ 如果传入的是const变量或const引用,则根据最佳匹配原则,会调用b函数
3.3 普通指针形参与const指针形参
与“普通引用形参与const引用形参”相同
4 类的const成员函数
1) const成员函数与非const成员函数是不同的重载:非const的对象会调用非const版本的重载;const对象会调用const版本(最佳匹配);
2) const成员函数返回(*this)时,返回的是const引用,这个引用不能用于继续调用非const的其他成员函数。
3) const成员函数只能调用其他const成员函数或static成员函数,不能调用普通成员函数。