虽然掌握const的作用原理,但是对于const的具体运用却比较模糊和分散,因此通过在论坛和搜索到的资料进行整合和分析,对const的常见用法做一个小结。
1、限定声明变量只能被读,也就是所谓的定义常量变量,变量不能通过赋值运算进行修改。
int i = 5;
i = 6;//合法
const int j = 5;
j = 6;//非法,导致编译错误
但是,并不意味着被const修饰的常量变量不可能被修改,我们可以通过强制类型转换对i所在地址的值进行修改。
const int i = 10;
int * p = (int *)&i;
*p = 100;
printf("%d\n", i);//输出的值为10
printf("%d\n", *&i);//输出的值为100
因此,我们通过强制类型转换修改的是i所在地址的值。
<span style="font-family:SimSun;font-size:18px;"><span style="white-space:pre"> </span>#include <stdio.h>
<span style="white-space:pre"> </span>void fun(int *a);
<span style="white-space:pre"> </span>void fun1(int *b);
<span style="white-space:pre"> </span>int main(int argc, const char * argv[])
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span> int a = 5;
<span style="white-space:pre"> </span> int b = 6;
<span style="white-space:pre"> </span> fun(&a);
<span style="white-space:pre"> </span> printf("%d", a);
<span style="white-space:pre"> </span> fun1(&b);
<span style="white-space:pre"> </span> return 0;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>void fun(int *a)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span> *a = 6;
<span style="white-space:pre"> </span>}<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>void fun1(const int *b)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span> *b = 6;//报错!! const
<span style="white-space:pre"> </span>}</span>
这样声明了返回值后,const按照"修饰原则"进行修饰,起到相应的保护作用。
{
return Rational(lhs.numerator() * rhs.numerator(), lhs.denominator() * rhs.denominator());
}
返回值用const修饰可以防止允许这样的操作发生:
Radional c;
(a*b) = c;
一般用const修饰返回值为对象本身(非引用和指针)的情况多用于二目操作符重载函数并产生新对象的 时候。
4、const修饰成员函数:
使用const修饰的变量必须初始化,在类中又不能在定义时初始化,
如;
class
{
private:
int a = 10;
const int b = 10;
static const int c = 10;
//这样初始化都是错的,
}
class Socket
{
public:
typedef unsigned short socket_port_t;
socket_port_t LocalPort( void ) const
{
++readCount;
return _port;
}
private:
socket_port_t _port;
mutable int _readCount;
};
使用const修饰的成员函数不能修改类的成员变量,如成员_port,而且只能调用成员类对象const函数 ,但有个例外,就是mutable修饰的成员变量可以在const修饰的成员函数中被修改,如_readCount。 另外,const只能修饰非静态函数。
心得:将所有不改变对象状态的函数都使用const修饰符标识,以提高程序的可读性。其实,头文件就是 最好的类接口的说明文档,越多的提供信息就能使程序的可读性越好,越利于维护。看到成员函数的con st修饰符,读者便立即明白该函数不会改变程序的状态,这也有利于当程序状态出现异常时的问题定位。