const在C与C++中的区别

1、const用于C –> 运行时常量

a. 修饰变量
修饰变量为常变量(只读变量)

const int i = 10;

此时i还是一个变量,不信你可以把它用来当作定义一个数组时的数组长度,一定会报错。不过它具有一种常属性,它的值一直都是10,不是发生改变(当然有人会说我有办法使它改变),因此我们说它是常变量,或叫作只读变量,因此我们一定要记住在定义只读变量时要把它初始化为我们想要的值。

因此我们的代码中千万不要出现这种低级错误,数组的长度是一个常量表达式,尽管const修饰的变量是一个常变量,但它本质上仍然是一个变量:

int a = 10;
int arr[a] = { 0 };

前面说了,此时i的值其实有办法改变,那么怎么改变呢?

const int i = 10;
int *pi = &i;
*pi = 20;

上面是利用了指针的方式改变了i的地址空间里的内容,从而使i的值发生了改变。说到指针,想起了一个const位置不同而修饰对象不同的问题,看看下面这段代码,const都分别修饰什么:

const int *p;
int const *p;
int *const p;
const int *const p;

是不是心里已经一万个那什么在奔跑了,别着急,其实很简单的,先忽略类型名(编译器解析的时候也是忽略类型名),我们看 const 离哪个近。“近水楼台先得月”,离谁近就修饰谁。

const *p;       //const 修饰*p,p 是指针, *p 是指针指向的对象,不可变
const *p;       //const 修饰*p,p 是指针, *p 是指针指向的对象,不可变
*const p;       //const 修饰 p, p 不可变, p 指向的对象可变
const *const p; //前一个 const 修饰*p,后一个 const 修饰 p,指针 p 和 p 指向的对象
都不可变

b. 修饰函数参数
修饰函数参数或返回值,这儿的作用与修饰变量几乎一致,都是不允许被修饰的对象的值发生变化。
因为许多的函数,都不希望在函数内部的操作使函数参数的值发生变化,那么我们就可以用const来修饰这些参数,这里用一个库函数strcmp来说明:

/***
*strcmp.c - routine to compare two strings (for equal, less, or greater)
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       Compares two string, determining their lexical order.
*
*******************************************************************************/

#include <cruntime.h>
#include <string.h>

#pragma function(strcmp)

/***
*strcmp - compare two strings, returning less than, equal to, or greater than
*
*Purpose:
*       STRCMP compares two strings and returns an integer
*       to indicate whether the first is less than the second, the two are
*       equal, or whether the first is greater than the second.
*
*       Comparison is done byte by byte on an UNSIGNED basis, which is to
*       say that Null (0) is less than any other character (1-255).
*
*Entry:
*       const char * src - string for left-hand side of comparison
*       const char * dst - string for right-hand side of comparison
*
*Exit:
*       returns -1 if src <  dst
*       returns  0 if src == dst
*       returns +1 if src >  dst
*
*Exceptions:
*
*******************************************************************************/

int __cdecl strcmp (
        const char * src,
        const char * dst
        )
{
        int ret = 0 ;

        while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
                ++src, ++dst;

        if ( ret < 0 )
                ret = -1 ;
        else if ( ret > 0 )
                ret = 1 ;

        return( ret );
}

2、const用于CPP –> 编译时常量

a. 继承与C

C++里面的const几乎有C语言的const的全部作用,但有一点区别就是,C语言里的const修饰的变量还是一个变量,尽管它具有常属性,但是C++里的const修饰的变量,就彻底“沦为”了一个常量,这儿其实它的作用与#define很像,因此在上面会发生错误的一个例子,在这儿却能不会出错:

const int a = 10;
int arr[a] = { 0 };

这儿它是正确的,其实它就等价于:

#define a 10
int arr[a] = { 0 };

当然,#define后面最好跟大写字母,这儿为了与上面的例子统一,就用了小写。
这儿也印证了C语言中的const是运行时常量,C++的const是编译时常量的说法。

b. const修饰类成员
const类成员在对象构造期间允许被初始化并且在以后不允许被改变。const类成员和一般的const 变量有所不同。const类成员是对应于每个对象而言,它在对象构造期间被初始化,在这个对象的生存周期中不允许被改变。

c. const修饰成员函数
const 成员函数不允许在此函数体内对此函数对应的类的所有成员变量进行修改,这样可以提高程序的健壮性。const一般放在函数体后:
functionType fun() const。

3、const在C和C++中最大的不同是,在C中,const默认具有外部链接,而C++中则是内部链接。所以当你只在定义const常量的文件中使用该常量时,c++不给你的const常量分配空间,此时const int c = 0;相当于#define c 0;而在C中,它会给每个const 常量分配内存空间。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值