C++ - explicit和volatile/const的内容
第一眼见到explicit和volatile可能会一愣一愣的觉得可能是c11或者c14新加的标识符。
其实不是这样,volatile和const两个关键字在C语言的第二个版本KR C的时候就被加入了C标准,他们是两个相对的关键字
const 修饰符表示这是一个常量类型,这个变量的值不会被程序改变 volatile 修饰符表示这个变量可能被编译器以外的行为(譬如内联汇编程序)改变。
修饰常量变量只要和类型紧挨着就可以
int const a = ;
const int a = ;
修饰指针时以*号为分界符号
#include <iostream>
#include <iostream> int main() {
int a = ;
int b = ; const int *p1 = &a;
int const *p2 = &a;
int *const p3 = &a;
const int *const p4 = &a;
int const *const p5 = &a; printf("&a = %X\n", &a);
printf("&b = %X\n", &b); printf("p1 = 0x%X , *p1 = %d\n", p1, *p1);
printf("const int *p1 = &a; \n (*p1) = b;通过p修改a的值\n");
// (*p1) = b;
p1 = &b;
printf("p1 = 0x%X , *p1 = %d\n", p1, *p1);
printf("p2 = 0x%X , *p2 = %d\n", p2, *p2);
printf("int const *p2 = &a; \n (*p2) = b;通过p修改a的值\n");
// (*p2) = b;
p2 = &b;
printf("p2 = 0x%X , *p2 = %d\n", p2, *p2);
printf("p3 = 0x%X , *p3 = %d\n", p3, *p3);
printf("int *const p3 = &a; \n p3 = &b;修改p的指向\n");
// p3 = &b;
(*p3) = b;
printf("p3 = 0x%X , *p3 = %d\n", p3, *p3);
printf("p4 = 0x%X , *p4 = %d\n", p4, *p4);
printf("const int *const p4 = &a; \n 二者都不能修改\n");
// (*p4) = &b;
// p4 = &b;
printf("p4 = 0x%X , *p4 = %d\n", p4, *p4);
printf("p5 = 0x%X , *p5 = %d\n", p5, *p5);
printf("int const *const p5 = &a; \n 二者都不能修改\n");
// (*p5) = &b;
// p5 = &b;
printf("p5 = 0x%X , *p5 = %d\n", p5, *p5);
return ;
}
gcc报错结果
J:\SITP\alg\main.cpp: In function 'int main()':
J:\SITP\alg\main.cpp::: error: assignment of read-only location '* p1'
(*p1) = b;
^
J:\SITP\alg\main.cpp::: error: assignment of read-only location '* p2'
(*p2) = b;
^
J:\SITP\alg\main.cpp::: error: assignment of read-only variable 'p3'
p3 = &b;
^
J:\SITP\alg\main.cpp::: error: assignment of read-only location '*(const int*)p4'
(*p4) = &b;
^
J:\SITP\alg\main.cpp::: error: invalid conversion from 'int*' to 'int' [-fpermissive]
J:\SITP\alg\main.cpp::: error: assignment of read-only variable 'p4'
p4 = &b;
^
J:\SITP\alg\main.cpp::: error: assignment of read-only location '*(const int*)p5'
(*p5) = &b;
^
J:\SITP\alg\main.cpp::: error: invalid conversion from 'int*' to 'int' [-fpermissive]
J:\SITP\alg\main.cpp::: error: assignment of read-only variable 'p5'
p5 = &b;
^
mingw32-make.exe[]: *** [CMakeFiles/alg.dir/main.cpp.obj] Error
mingw32-make.exe[]: *** [CMakeFiles/alg.dir/all] Error
mingw32-make.exe[]: *** [CMakeFiles/alg.dir/rule] Error
CMakeFiles\alg.dir\build.make:: recipe for target 'CMakeFiles/alg.dir/main.cpp.obj' failed
CMakeFiles\Makefile2:: recipe for target 'CMakeFiles/alg.dir/all' failed
CMakeFiles\Makefile2:: recipe for target 'CMakeFiles/alg.dir/rule' failed
mingw32-make.exe: *** [alg] Error
Makefile:: recipe for target 'alg' failed
将非法的行注释掉之后可以看到允许修改的内容
J:\SITP\alg\cmake-build-debug\alg.exe
&a = 72FE24
&b = 72FE20
p1 = 0x72FE24 , *p1 =
const int *p1 = &a;
(*p1) = b;通过p修改a的值
p1 = 0x72FE20 , *p1 =
p2 = 0x72FE24 , *p2 =
int const *p2 = &a;
(*p2) = b;通过p修改a的值
p2 = 0x72FE20 , *p2 =
p3 = 0x72FE24 , *p3 =
int *const p3 = &a;
p3 = &b;修改p的指向
p3 = 0x72FE24 , *p3 =
p4 = 0x72FE24 , *p4 =
const int *const p4 = &a;
二者都不能修改
p4 = 0x72FE24 , *p4 =
p5 = 0x72FE24 , *p5 =
int const *const p5 = &a;
二者都不能修改
p5 = 0x72FE24 , *p5 = Process finished with exit code
C++ - explicit和volatile/const的内容的更多相关文章
- c++const小结
C++const简单整理,本文的首次是在博客园发布的,如有错误,欢迎大家指正 博客园链接:http://www.cnblogs.com/Forever-Kenlen-Ja/p/3776991.html ...
- C++ const用法小结 (欢迎大家拍砖)
C++const 关键字小结 const 是constant的缩写,本意是不变的,不易改变的意思. const 在C++中是用来修饰内置类型变量,自定义对象,成员函数,返回值,函数参数. 一.cons ...
- __I、__O 、__IO volatile是什么?怎么用? .
这是ST库里面的宏定义,定义如下: #define __I volatile const /*!< defines 'read only' permissions */ #define __O ...
- c语言,volatile
一.意义: 该关键字的意义就是表示定义的变量值随时都会改变,必须从变量的地址处读取值,所以只有这个变量在使用过程中可能被改变(比如中断程序),就需要用这个关键字说明. )volatile, ...
- C/C++中const关键字的用法及其与宏定义的比较
1.const关键字的性质 简单来说:const关键字修饰的变量具有常属性. 即它所修饰的变量不能被修改. 2.修饰局部变量 ; ; 这两种写法是等价的,都是表示变量的值不能被改变,需要注意的是,用c ...
- 1.C和C++区别,以及const分析
从本章起开始从0学习C++,本章主要内容: 1)C和C++的基本区别 2)C和C++的const区别 1.C++和C区别 1.1 C++更强调语言的实用性,所有变量都可以在需要时再定义 比如: ;i& ...
- C/C++中const关键字的用法及其与宏常量的比较
1.const关键字的性质 简单来说:const关键字修饰的变量具有常属性. 即它所修饰的变量不能被修改. 2.修饰局部变量 ; ; 这两种写法是等价的,都是表示变量的值不能被改变,需要注意的是,用c ...
- 10.C++-构造函数初始化列表、类const成员、对象构造顺序、析构函数
首先回忆下,以前学的const 单独使用const修饰变量时,是定义的常量,比如:const int i=1; 使用volatile const修饰变量时,定义的是只读变量 使用const & ...
- volatile的陷阱
对于volatile关键字,大部分C语言的教程都是一笔带过,并没有做太深入的分析,所以这里简单的整理了一些 关于volatile的使用注意事项.实际上从语法上来看volatile和const ...
随机推荐
- Web标准:六、html列表
Web标准:六.html列表 知识点: 1.ul无序和ol有序列表 2.改变项目符号样式或用图片定义项目符号 3.横向图文列表 4.浮动后父容器高度自适应 5.IE6的双倍边距bug 1)ul无序 ...
- 亲, 我们来再重申一遍"=="和"equals的区别
今天经历的一个事情太丢脸了, 一个学弟向我请教问题, 是这样的: 一个字符串里面含有空格, 不允许使用.trim()和replace方法, 只用if和for将空格去掉, 题目很简单, 一开始我是这样写 ...
- hdoj1074--Doing Homework (DP 状态压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 思路: 看着数据很小,15,但是完成的顺序有15!情况,这么大的数据是无法实现的.上网查才知道要 ...
- 中文路径读取乱码,json乱码
strPath = 'E:\新建文件夹' #含有中文的路径,使用unicode函数转换. strPath = unicode(strPath , "utf8") 参考:http:/ ...
- python连接redis,redis集群
python连接redis: import redis r = redis.Redis(host='192.168.50.181',port=6002) r.set('user_phone_14900 ...
- 【原创】java删除未匹配的文件夹FileFileFilter,FileUtils,删除目录名字不是某个名字的所有文件夹及其子文件夹
闲着无聊,写了个小程序. 需求: 举例: 比如我的E盘有一个test的目录,test的结构如下: 要求除了包含hello的目录不删除以外,其他的所有文件夹都要删除. 代码如下: package com ...
- 35-面试:如何找出字符串的字典序全排列的第N种
http://www.cnblogs.com/byrhuangqiang/p/3994499.html
- TASK 的使用
http://www.tuicool.com/articles/IveiQbQ
- part1:7-Linux网络配置
1.虚拟机(Vmware)网络配置 VMware虚拟机对于不同的网络环境提供了三种网卡工作模式: Bridged:网桥模式: 在桥接模式下,计算机A充当路由器与虚拟机之间的“桥”,虚拟机通过计算机A的 ...
- 日历时间选择控件---3(支持ie、火狐)
效果展示: 源代码: <script language=javascript ><!--/* 调用方法:不能用onfocus,要用onclick <input onclic ...