CONST的用法小结:

虽然掌握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所在地址的值。

并且,常量变量必须初始化,且不能被再次赋值。
const int i;//错误
const int i = 8;//正确

2、修饰指针。在将参数传递给函数时,函数能通过传递的参数修改函数外部变量的值,利用const修饰传递的参数来保护外部变量的值不被修改。

<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修饰指针有以下几种情况:
int a = 5;

1)const int * p = &a;
2)int const * p = &a;

3)int * const p = &a;

4)const int * const p = &a;
其中1 和 2 两类情况作用效果是一样的,统称为*前const。这类指针的 p 可变, *p(即p所指向的对象)不可变!
第3类情况,称为*后const。这种类型的指针,p不可变, *p(即p所指向的对象)可变!!
第4类情况,这类指针,p 和 *p 都不可变!!


3、修饰函数返回值,防止返回值被改变:
修饰返回值的const,如const A fun2( ); const A* fun3( ); 
这样声明了返回值后,const按照"修饰原则"进行修饰,起到相应的保护作用。
const Rational operato r* (const Rational& lhs, const Rational& rhs) 

return Rational(lhs.numerator() * rhs.numerator(), lhs.denominator() * rhs.denominator()); 

返回值用const修饰可以防止允许这样的操作发生:
Rational a,b; 
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修饰符,读者便立即明白该函数不会改变程序的状态,这也有利于当程序状态出现异常时的问题定位。

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值