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 ...
随机推荐
- org.apache.catalina.core.StandardContext.listenerStart Error configuring application listener of class org.springframework.web.context.ContextLoaderListener java.lang.ClassNotFoundException
使用Intelij Idea时,报错如下: org.apache.catalina.core.StandardContext.listenerStart Error configuring appli ...
- numpy.unpackbits()
numpy.unpackbits numpy.unpackbits(myarray, axis=None) Unpacks elements of a uint8 array into a binar ...
- C++ 静态数据成员和静态成员函数
一 静态数据成员: 1.静态数据成员的定义. 静态数据成员实际上是类域中的全局变量.所以,静态数据成员的定义(初始化)不应该被放在头文件中,因为这样做会引起重复定义这样的错误.即使加上#ifndef ...
- GridView自定义分页样式(上一页,下一页,到第几页)
今天要为网站做一个文章列表,发现GridView的分页样式很难看,于是结合网上的例子,自己做了一个.不是很美观,不过还是很实用的,先看下效果吧,如图(1). 图(1)GridView分页效果 自定义G ...
- Java学生信息增删改查(并没用数据库)
一个泛型的应用,Java版本增删改查,写的简陋,望批评指正 2016-07-02 很久前写的一个程序了.拿出来存一下,不是为了展示啥,自己用的时候还可以看看.写的很粗糙. import java.io ...
- .net调用web邮箱发送邮件(转载)
public static void SendEmail() { System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient( ...
- vmware14中安装centos7并使用docker发布spring-boot项目
1.vmare中centos7安装(同一路由器无线网络下) 1.1选择桥接模式 1.2修改配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33(这里不一 ...
- NPOI创建doc
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- 将Boost库添加到Visual Studio 2017
在windows 环境中,一般比较推荐的打包软件的方式是,将自己所需要的共享库放在软件自己的文件夹中,并且避免与其它的软件共用.除非是微软的官方组件,比如微软自家的VC Runtime. Boost库 ...
- .net 4.0的Lazy<T>方法,反射实现延迟加载。
//自己山寨.public class YaLazy<T> { private bool _isValueCreated = false; public bool IsValueCreat ...