const用法详解

简介:

(以下代码用gcc或g++编译)

1.修饰普通变量

 const int a;

 int const a;

 这两种是一样的,没有区别,另外 int a const 是错误的。

 其实上述两种方式也是错的,必须初始化才行!

 如果不初始化,C++编译器会提示错误,没有initialize,而C编译器正常,但是如果在下面在赋值的话就错了,不能对常量赋值。

 

2.修饰指针变量

有很多种写法,逐个分析。

  const int * a; 

 这个const修饰的重点是int,也就是说,a并不是常量,a是可以变的,(*a)是不能变的,详细见如下代码。

 
  1. #include<stdio.h> 
  2. int main() 
  3.   const int * a; 
  4.   int b; 
  5.   a=&b; 
  6.   b=5; 
  7.   (*a)=5; 
  8.   return 0; 

test.cpp:8: 错误:assignment of read-only location
我们可以对b进行赋值,但是不能用(*a)对其赋值。明白了吧?

 int const * a;

 这个与 const int *a是一样的,a可以赋值,但是(*a)不能赋值。 

 

 int * const a;

 这个修饰的是a,a是什么类型的?a是指针类型,所以说a必须初始化,a只能指向一个地址,但是地址里的内容是可以改的。

 看如下代码

 
  1. #include<stdio.h> 
  2. int main() 
  3.  int * const a; 
  4. test.cpp: In function ‘int main()’: 
  5. test.cpp:4: 错误:未初始化的常量 ‘a’ 

必须初始化。

然后再看

 
  1. #include<stdio.h> 
  2. int main() 
  3.  int b; 
  4.  int c; 
  5.  int * const a=&b; 
  6.  (*a)=5; 
  7.  a=&c;  
  8. test.cpp: In function ‘int main()’: 
  9. test.cpp:8: 错误:assignment of read-only variable ‘a’ 


 

 const int * const a;

 这个就是定死了,a也不能修改,(*a)也不能修改,而且a必须初始化。

 
  1. #include<stdio.h> 
  2. int main() 
  3.  int b; 
  4.  int c; 
  5.  int constconst  a=&b; 
  6.  (*a)=5; 
  7.  a=&c; 
  8. test.cpp: In function ‘int main()’: 
  9. test.cpp:7: 错误:assignment of read-only location 
  10. test.cpp:8: 错误:assignment of read-only variable ‘a’ 

还有其中区别方法:

沿着*号划一条线,

如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;

如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。

3.修饰函数参数

int fun (int const a) 或者 int fun (const int a);

传递过来的变量不能修改,也就是a不能在函数体内进行赋值什么的,但是这个意义不大,因为a是形参。

 
  1. using namespace std;  
  2. int fun(const int a)  
  3. {  
  4.   a=5;  
  5.   return a;  
  6. }  
  7. int fun1(int const a)  
  8. {  
  9.    a=2;  
  10.    return a;  
  11. }  
  12. int main()  
  13. {  
  14.   int b;  
  15.   fun(b);  
  16.   return 0;  
  17. }  
  18. test.cpp:5: error: assignment of read-only parameter ‘a’  
  19. test.cpp: In function ‘int fun1(int)’:  
  20. test.cpp:10: error: assignment of read-only parameter ‘a’  

int fun ( const char * a) ;

a可以变,但是(*a)不可以变。但是我们可不可以通过另外一个指针变量给(*a)赋值呢?

比如 int *c=a; (*c)=5,这不就实现对a所指向的地方的间接修改了吗?

错了,int *c=a是错的,因为c与a不是一个类型。必须const int * c=a才行,那既然这样,还是不能修改a指向的那个地方,因此,这个用法是很有用的,传指针过去,但是你不能通过指针改我的值,主要的好处是节省了开销。看下面的例子

 
  1. #include<iostream>  
  2. using namespace std;  
  3. int fun(const int* a)  
  4. {  
  5.   int b;  
  6.   int * c;  
  7.   c=a;  
  8.   (*a)=b;  
  9.   a=&b;  
  10.   (*c)=5;  
  11.   return b;  
  12. }  
  13. int main()  
  14. {  
  15.   int b;  
  16.   fun(&b);  
  17.   return 0;  
  18. }  
  19. test.cpp: In function ‘int fun(const int*)’:  
  20. test.cpp:7: error: invalid conversion from ‘const int*’ to ‘int*’  
  21. test.cpp:8: error: assignment of read-only location  

int fun (int * const a);

这个跟第一种差不多,没多少意义,就是不能修改a,但是a也是形参,(*a)是可以改的。

修饰引用int fun (const int& a);

a不能被修改,这个也很常用。就着一种形式,int fun( int & const a)没有这种形式。

 
  1. #include<iostream> 
  2. using namespace std;  
  3. int fun( const int&  a)  
  4. {  
  5.   int b;  
  6.   a=5;  
  7.   b=a;  
  8.   return b;  
  9. }  
  10. int main()  
  11. {  
  12.   int b;  
  13.   fun(b);  
  14.   return 0;  
  15. }  
  16. test.cpp: In function ‘int fun(const int&)’:  
  17. test.cpp:5: error: assignment of read-only reference ‘a’  

4.修饰返回值

const int fun (int a);

这个无意义,因为返回的本身就是一个常量。

const int * fun (int a);

这个怎么理解的,其实就可以把const int *看作一种类型,返回值是const int *类型的,这个需要好几个代码

首先,下面代码

 
  1. #include<iostream>  
  2. using namespace std;  
  3. const int* fun(  int  a)  
  4. {  
  5.   a=5;  
  6.   return &a;  
  7. }  
  8. int main()  
  9. {  
  10.   int b;  
  11.   fun(b);  
  12.   return 0;  
  13. }  
  14. test.cpp: In function ‘const int* fun(int)’:  
  15. test.cpp:3: warning: address of local variable ‘a’ returned  

局部变量的地址返回是没意义的,但是没错,说明在函数体内返回不是const int *类型的没关系。

然后

 
  1. #include<iostream>  
  2. using namespace std;  
  3. const int* fun(  int&  a)  
  4. {  
  5.   a=5;  
  6.   return &a;  
  7. }  
  8. int main()  
  9. {  
  10.   int b;  
  11.   int *c;  
  12.   const int *d;  
  13.   c=fun(b);  
  14.   d=fun(b);  
  15.   return 0;  
  16. }  
  17. test.cpp: In function ‘int main()’:  
  18. test.cpp:13: error: invalid conversion from ‘const int*’ to ‘int*’  

说明这个只在赋值的时候有影响,必须赋给const int *类型的才行。

 int * const fun(int a);

这个的用法还没搞清楚,不过一般没有这么用的。

 
  1.  
  2. #include<iostream>  
  3. using namespace std;  
  4.  intconst fun(  int&  a)  
  5. {  
  6.   a=5;  
  7.   return &a;  
  8. }  
  9. int main()  
  10. {  
  11.   int b;  
  12.   int *c;  
  13.   int *d;  
  14.   c=fun(b);  
  15.   d=fun(b);  
  16.   int *e=fun(b);  
  17.   int * const f=fun(b);  
  18.   return 0;  
  19. }  

5.修饰成员对象/对象指针/对象引用

跟普通变量一样,但是有一点要注意,被const修饰的对象不能调用内部没有被const修饰过的成员函数,因为这样的函数有修改内部成员变量的嫌疑。



本文转自nxlhero 51CTO博客,原文链接:http://blog.51cto.com/nxlhero/405863,如需转载请自行联系原作者

相关文章
|
7月前
|
Ubuntu Linux Windows
IP地址查看方法
本指南介绍了在不同操作系统中查看设备IP地址的方法。在Windows系统中,可通过命令提示符(输入`ipconfig`)或设置界面查找IPv4地址;Linux系统中,使用终端命令`ifconfig`或`ip addr show`获取网络接口的IP;Mac系统则可在“系统偏好设置”中的“网络”查看,或通过终端执行相同命令获取。这些方法简单易行,适用于各种常见场景。
3442 11
|
Oracle 关系型数据库 数据库
手把手教你Oracle DataGuard主备切换(switchover)
手把手教你Oracle DataGuard主备切换(switchover)
1685 4
|
监控
ThreeJs限制模型拖动的范围
这篇文章讲解了在Three.js中如何限制模型拖动的范围,确保模型在特定边界内移动,提供了实现拖动限制的代码示例和技术细节。
422 1
ThreeJs限制模型拖动的范围
|
11月前
|
存储 人工智能 开发框架
Eliza:TypeScript 版开源 AI Agent 开发框架,快速搭建智能、个性的 Agents 系统
Eliza 是一个开源的多代理模拟框架,支持多平台连接、多模型集成,能够快速构建智能、高效的AI系统。
1169 8
Eliza:TypeScript 版开源 AI Agent 开发框架,快速搭建智能、个性的 Agents 系统
|
8月前
|
存储 缓存 固态存储
C盘清理终极指南:释放宝贵空间的有效技巧
C盘空间不足?别担心!本文《C盘清理终极指南》为你提供从基础到深度的全方位清理技巧。通过系统自带工具、手动删除无用文件、专业软件分析,再到系统设置优化与应用程序管理,助你高效释放磁盘空间,提升电脑性能。特别提示:清理前请备份重要数据,避免误删。按此指南操作,轻松解决C盘臃肿问题,让电脑重焕活力!
3636 0
|
存储 安全 小程序
什么是云计算,为什么选择阿里云?
阿里云提供的云计算服务让您能以按需、按量的方式获取算力,涵盖计算、存储、网络等多种形态,无需自建数据中心。它具备弹性、敏捷、安全、稳定、高性能和低成本等优势,支持业务快速创新,保障数据安全及业务连续性,帮助您专注于核心业务发展。常见应用场景包括网站、小程序、移动应用及大模型问答机器人等。
531 1
|
Kubernetes 安全 JavaScript
Docker 与 Podman:探索用于现代 Web 开发的容器技术
在软件开发中,Docker 和 Podman 作为主流容器化技术,各具特色。本文深入对比两者优缺点,探讨其实用场景与部署Web应用的最佳实践。Docker 凭借成熟生态和跨平台能力引领潮流;Podman 以无守护进程架构提升安全与效率。通过具体示例展示如何构建和运行Node.js与Angular应用,帮助读者理解核心命令与配置要点。无论是在开发环境还是生产部署,选择合适的工具能显著增强应用的安全性和稳定性。
784 1
|
人工智能 算法 自动驾驶
智能时代的伦理困境:AI技术的道德边界
【7月更文挑战第26天】在AI技术的飞速发展中,我们不仅见证了科技的奇迹,也面临着前所未有的伦理问题。本文探讨了人工智能带来的道德挑战,包括隐私侵犯、自动化失业、算法偏见以及决策责任归属等问题。通过分析这些伦理困境,文章旨在引发对AI技术应用中道德边界的深入思考和讨论。
|
存储 网络性能优化 芯片
芯片引脚字母代表的意义
芯片引脚字母代表的意义---常用
7760 0
|
网络协议 Linux 网络安全
Centos7中如何打开和关闭防火墙??CentOS 7以上默认使用firewall作为防火墙改为iptables
Centos7中如何打开和关闭防火墙??CentOS 7以上默认使用firewall作为防火墙改为iptables