c++中的 const 关键字
知识回顾:C语言中 const
const 修饰的变量是 只读的,本质上还是变量;(只读变量:可以通过指针修改只读变量中的值)
const 修饰的局部变量在栈上分配空间;
const 修饰的全局变量在只读存储区分配空间;
const 只在编译期间生效,在运行期间无效;
const 修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边;
#include <stdio.h> int main()
{
const int c = ; // c 是只读变量
int* p = (int*)&c; *p = ; printf("c = %d\n", c); // c = 5 return ;
}
// 编译器 gcc
c语言中 const
c++ 中 const
1. const 常量
1)const 修饰的变量 是一个真正的常量;
这是由于c++中使用的符号表机制,当使用一个字面量初始化const变量时,就会将该字面量放入符号表中;在编译过程中,若发现使用该变量,就会将这个变量替换为符号表中值;
2)在编译过程中,若发生以下情况,则可能会给对应的常量分配存储空间;
1、当 const 常量为全局时,并且需要在其它文件中使用;(extern)
2、当使用 & 操作符对 const 常量取地址;
注:c++ 编译器虽然可能为 const 常量分配存储空间,但不会使用其存储空间中的值;
#include <stdio.h> int main()
{
const int c = ; // c 是常量
int* p = (int*)&c; *p = ; printf("c = %d\n", c); // c = 10 return ;
} // 编译器 g++
const 常量
3)const 常量 与 宏定义
相同点:
c++中 const 常量 ≈ 宏定义;( const int a = 10; ≈ #define a 10 )
不同点:
const 是由编译器处理,编译器对 const 有 类型检查 和 作用域检查;
宏定义 是由预处理器处理,只是单纯的文本替换;
#include <stdio.h> void f()
{
#define a 3
const int b = ;
} void g()
{
printf("a = %d\n", a);
//printf("b = %d\n", b); // err
} int main()
{
const int A = ;
const int B = ;
int array[A + B] = {};
int i = ; for(i=; i<(A + B); i++)
{
printf("array[%d] = %d\n", i, array[i]);
} f();
g(); return ;
}
const常量 与 宏定义
结论:--- 经典问题解析一
1)const 常量的判断方法:
1、只有用 字面量初始化的 const 常量才会进入符号表;
2、使用其它变量初始化的 const 常量仍然是 只读变量;
3、被 volatile 修饰的 const 常量不会进入符号表;
2)const 引用类型 与 初始化变量的类型
相同:初始化变量成为只读变量;
不同:生成一个新的只读变量;
#include <stdio.h> int main()
{
const int x = ; // 只有用 字面量 初始化的const常量才进入符号表--- 此处x进入符号表,x是常量
const int& rx = x; // 编译器分配给常量x的内存地址的别名为 rx--- rx是只读变量 int& nrx = const_cast<int&>(rx); // 去除只读变量rx的只读属性 --- nrx nrx = ; printf("x = %d\n", x); //
printf("rx = %d\n", rx); //
printf("nrx = %d\n", nrx); //
printf("&x = %p\n", &x); // 0x7ffd8aed8f90
printf("&rx = %p\n", &rx); // 0x7ffd8aed8f90
printf("&nrx = %p\n", &nrx); // 0x7ffd8aed8f90 volatile const int y = ; // volatile 修饰的const常量不会进入符号表---y是只读变量
int* p = const_cast<int*>(&y); // 去除y的只读属性 *p = ; printf("y = %d\n", y); //
printf("&y = %p\n", &y);// 0x7ffd8aed8f94
printf("p = %p\n", p); // 0x7ffd8aed8f94 const int z = y; // 用 其它变量 初始化const常量,仍是只读变量 --- z是只读变量 p = const_cast<int*>(&z); // 去除z的只读属性 *p = ; printf("z = %d\n", z); //
printf("&z = %p\n", &z);// 0x7ffd8aed8f98
printf("p = %p\n", p); // 0x7ffd8aed8f98 char c = 'c';
char& rc = c;
const int& trc = c; //const引用类型 与 初始化变量的类型不一致,则生成新的只读变量 --- trc为新的只读变量 printf("c = %c\n", c); // c
printf("rc = %c\n", rc); // c
printf("trc = %c\n", trc); // c rc = 'a'; printf("c = %c\n", c); // a
printf("rc = %c\n", rc); // a
printf("trc = %c\n", trc); // c return ;
}
1)2)结论的代码展示
3) 指针常量 Type * const pt (引用的本质)
c++中没有引用数组的概念;(因为数组在内存中是一段连续的存储空间,然而引用数据并不满足这个要求)
2 类中的 const(const 对象 和 const 成员函数)--- 经典问题解析二
const 对象的特点:
1)const修饰的对象为只读对象;
2)只读对象的成员变量不可以修改;
3)只读对象是编译阶段的概念,运行时无效;
注:const 对象 不推荐使用;
const 成员函数的特点:
1)只读对象只能调用const成员函数;
2)const成员函数 只能 调用const成员函数;
3)const成员函数 不能 直接修改成员变量的值;(const 成员函数 使 this指针所指向的对象具有了只读属性)
注:const 成员函数 在 声明与定义的时候必须都有 const;
#include <stdio.h> class Test
{
int mi;
public:
Test(int i);
Test(const Test& t);
int getMi() const;
void print();
}; Test::Test(int i)
{
mi = i;
} Test::Test(const Test& t)
{ } int Test::getMi() const
{
//mi = 0; // error // const成员函数 不能 直接修改成员变量的值
//print();// error // const成员函数 只能 调用const成员函数
return mi;
} void Test::print()
{
printf("v = %d\n", mi);
} int main()
{
/*
* 1 const可以修饰类的对象
* 2 const修饰的对象为只读对象
* 3 只读对象的成员变量不可以修改
* 4 只读对象是编译阶段的概念,运行时无效
*/
/*
* 1 只读对象只能调用const成员函数
* 2 const成员函数 只能 调用const成员函数
* 3 const成员函数 不能 直接修改成员变量的值
*/
const Test t();
printf("v = %d\n", t.getMi()); // 只读对象只能调用const成员函数 return ;
}
const 对象 和 const 成员函数
c++中的 const 关键字的更多相关文章
- C++中的const关键字
http://blog.csdn.net/eric_jo/article/details/4138548 C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方 ...
- C++ 类中的const关键字
//类中的const关键字 #include<iostream> using namespace std; class Point{ public: //这个const关键字本质上修饰的是 ...
- C++中的const关键字的用法
1.const用于修饰普通变量,表示常量,不建议修改,某种程度上不允许修改(其实也是可以修改的) 指针常量 :指针(指向的变量的值)自身是一个常量,说明不能改变自身的指向 int* const p= ...
- C++中的const关键字学习笔记
一.const引用 1. 例子一 #include <iostream> using namespace std; class sp { public: sp() {cout<< ...
- c++中的const关键字的理解
看effective c++第二版推荐使用const,少用define.今天才发现发现这远远不够. #define定义的常量在预处理替换,debug的时候无法打印宏的,这种常量设置是有缺陷的, con ...
- C++中const关键字的使用总结
C++中使用const关键字来修饰常量,下面从两个方面总结:变量和成员函数. 变量:const可以修饰普通变量.指针(数组)和结构体. 1.const修饰普通变量是最简单的情形.这样的用法多为在程序中 ...
- c++ --> const关键字总结
const关键字总结 C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性.const 是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变 ...
- 【3】学习C++之const关键字的使用
在C++中,const关键字是控制变量是否可以变化的,是否能够用好const关键字是区别小白和大佬的重要指标(大雾). 1.const与基本数据类型 ; //a是变量,a的值可以在后续操作中进行更改. ...
- const关键字到底该怎么用
原文地址:https://www.yanbinghu.com/2019/01/28/7442.html 前言 我们都知道使用const关键字限定一个变量为只读,但它是真正意义上的只读吗?实际中又该如何 ...
随机推荐
- maven 设置pom 指定jdk版本
<profile> <id>jdk-1.8</id> <activation> <activeByDefault>true</acti ...
- Django数据库查询优化-事务-图书管理系统的搭建
数据库查询优化 优化:虽然减轻了数据库的压力,但查询速度大大的减慢 ORM内所有的语句操作,默认都是惰性查询,只有你在真正的需要数据的时候才会走数据, 如果你只是写ORM语句时,是不会走数据库的,这样 ...
- vue-router query和params参数的区别
1.query方式传参和接收参数(相当于get请求) this.$router.push({ path:'/home' query:{ id:1 } }) 接收参数: this.$route.quer ...
- The website is API(4)
1.淘宝商品信息定向爬虫 目标:获取淘宝搜索页面信息,提取其中的商品名称和价格 理解:淘宝的搜索接口 翻页的处理 技术路线:requests+re https://s.taobao.com/searc ...
- Spring Cloud服务消费者(rest+ribbon)
在上一篇文章,讲了服务的注册和发现.在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式,一种是ribbon+r ...
- Git ubuntu 升级
外文文档 This team will distribute the most current stable package of Git for Ubuntu. Stable releases: h ...
- VisualStudioAddin2016Setup.rar
本工具是用于Visual Studio 2010 /2012 的外接程序. 功能不太多,常用代码,引用管理等. 动态图: 下载地址: VisualStudioAddin2016Setup.rar
- java通过jdbc插入中文到mysql显示乱码(问号或者乱码)
对于很多初学者来说,中文字符编码不相同的问题,是一个很烦躁的问题!! 因为很多时候,我们并不知道,到底是哪一层出现了问题? 在这里稍微做个总结~也怕自己今后忘了!! 其实也就三层: 1.前端页面 2. ...
- 吴裕雄--天生自然python学习笔记:python爬虫PM2.5 实时监测显示器
PM2.5 对人体的健康影响很大,所以空气中的 PM2.5 实时信息受到越来越多的关注. Python 的 Pandas 套件不但可以自动读取网页中的表格 数据 , 还可对数据进行修改.排序等处理,也 ...
- sklearn包源码分析(一)--neighbors
python如何查看内置函数的用法及其源码? 在anaconda的安装目录下,有一块会放着我们安装的所有包,在里面可以找到所有的包 找到scikit learn包,进入 这里面又有了多个子包,每个子包 ...