设为首页 - 加入收藏 华夏网 (http://www.hxwgxz.com)- 云主机,资讯,互联网,人工智能,云计算,大数据,区块链,VR,站长网!
热搜: 2019 google 中国 2020
当前位置: 主页 > 创业 > 正文

详解C/C++中const关键字的用法及其与宏常量的比较

发布时间:2020-12-30 16:27 所属栏目:[创业] 来源:网络整理
导读:1.const关键字的性质 简单来说:const关键字修饰的变量具有常属性。 即它所修饰的变量不能被修改。 2.修饰局部变量 const int a = 10; int const b = 20; 这两种写法是等价的,都是表示变量的值不能被改变,需要注意的是,用const修饰变量时,一定要给变量初

1.const关键字的性质

简单来说:const关键字修饰的变量具有常属性。 即它所修饰的变量不能被修改。

2.修饰局部变量

 const int a = 10;
 int const b = 20;

这两种写法是等价的,都是表示变量的值不能被改变,需要注意的是,用const修饰变量时,一定要给变量初始化,否则之后就不能再进行赋值了,而且编译器也不允许不赋初值的写法:

在C++中不赋初值的表达一写出来,编译器即报错,且编译不通过。

详解C/C++中const关键字的用法及其与宏常量的比较

详解C/C++中const关键字的用法及其与宏常量的比较

在C中不赋初值的表达写出来时不报错,编译时只有警告,编译可以通过。而当你真正给它赋值时才会报错,那么没有初值也不能被赋值这样的变量有什么用哪?

详解C/C++中const关键字的用法及其与宏常量的比较

 const chsr* p = "qwerty"; //const用于修饰常量静态字符串

如果没有const的修饰,我们可能会在后面有意无意的写p[4]='x'这样的语句,这样会导致对只读内存区域的赋值,然后程序会立刻异常终止。有了const,这个错误就能在程序被编译的时候就立即检查出来,这就是const的好处。让逻辑错误在编译期被发现。(这个特性在C/C++中相同)

3.修饰指针

常量指针是指针所指向的内容是常量,不可被修改。

 const int * n = &a;
 int const * n = &a;

上面两种写法也是等价的,性质如下:

1)常量指针通过不能这个指针改变变量的值,但是可以通过其他的引用来改变变量的值的。

const int *n = &a;
  *n = b;

上面的写法报错

详解C/C++中const关键字的用法及其与宏常量的比较

 int c = 3;
 const int *n = &a;
 a = 10;
 a = c;

这样赋值是可以的。

2)常量指针指向的值不能改变,但是指针本身可以改变,即常量指针可以指向其他的地址。

  int a = 1;
 int b = 2;
 const int *n = &a;
 n = &b;

指针常量是指指针本身是个常量,不能在指向其他的地址,写法如下: 

 int a = 1;
  int b = 2;
  int * const n = &a;
  *n = b;
  b = a;

而这么写是错误的

int a = 1;
 int b = 2;
 int c = 3;
 int * const n = &a;
 n = &b;

它们的区别在于const的位置,可以这样记忆:const在“*”前面时它修饰(*n),而*n是n所指向的变量,所以是常量指针,const在“*”后面时它修饰(n),使指针变为常量,所以是指针常量。

指向常量的常指针

 const int * const p= &a;
 int const * const p= &a;

指针指向的位置不能改变并且也不能通过这个指针改变变量的值,但是依然可以通过变量赋值,或其他的普通指针改变变量的值。

(这种用法在C和C++中是相同的。)

4.修饰引用

int a = 1;
 int const &a = b;
 const int &a = b;

两种定义形式在本质上是一样的

5.函数中使用const

(1)修饰函数参数

根据const修饰指针的特性,const修饰函数的参数也是分为三种情况

 void StrCopy(char *strdes,const char *strsrc);//防止修改指针指向的内容

其中 strsrc是输入参数,strdes是输出参数。给 strsrc 加上 const 修饰后,如果函数体内的语句试图改动 sresrc 的内容,编译器将指出错误。

 void swap ( int * const p1,int * const p2 ) //防止修改指针指向的地址

指针p1和指针p2指向的地址都不能修改。

void test ( const int * const p1,const int * const p2 ) //以上两种的结合

另外当参数为引用时

void function(const Class& Var); //引用参数在函数内不可以改变 
 void function(const TYPE& Var); //引用参数在函数内为常量不可变

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

网友评论
推荐文章