第12课.经典问题解析(const;指针和引用)
问题1:const什么时候为只读变量?什么时候是常量?
const常量的判别准则:
a.只有用字面量初始化的const常量才会进入符号表(直接初始化过的const为常量)
b.被使用其他变量初始化的const常量仍然是只读变量(间接初始化的const为只读变量)
c.被volatile修饰的const常量不会进入符号表(volatile:易变的。每次都要去内存中取出值。所以也是只读变量。voaltile易变的在这里决定了cosnst不可能是一个常量;const则说明在当前的作用域当中,修饰的变量不能出现在赋值符号的左边(只读))
总的来说:在编译期间不能直接确定初始值的const标识符,都被作为只读变量处理
const引用的类型与初始化变量的类型
类型相同:初始化变量为只读变量
类型不同:生成一个新的只读变量(类型为左值中的类型)
#include <stdio.h>
int main()
{
const int x = 1; //常量
const int& rx = x; //只读变量
int& nrx = const_cast<int&>(rx);
nrx = 5;
printf("x = %d\n", x); //1 x被写到符号表中
printf("rx = %d\n", rx); //5
printf("nrx = %d\n", nrx); //5
printf("&x = %p\n", &x); //地址相同
printf("&rx = %p\n", &rx);
printf("&nrx = %p\n", &nrx);
volatile const int y = 2; //只读变量
int* p = const_cast<int*>(&y);
*p = 6;
printf("y = %d\n", y); //6
printf("p = %p\n", p);
const int z = y; //只读变量
p = const_cast<int*>(&z);
*p = 7;
printf("z = %d\n", z); //7
printf("p = %p\n", p);
char c = 'c';
char& rc = c;
const int& trc = c; //这里const引用的初始化时的类型与初始值类型不同,所以这里被定义成了一个新的只读变量。此时const int& trc = c;相当于给一个名为trc空间的内存赋值了‘c’。
rc = 'a'; //修改不会影响到trc
printf("c = %c\n", c);
printf("rc = %c\n", rc);
printf("trc = %c\n", trc);
return 0;
}
问题2:引用于指针有什么关系?如何理解“引用的本质就是指针常量”?
指针:
指针是个变量。
a.值为一个内存地址,不需要初始化,可以保存不同的地址。
b.通过指针可以访问对应内存地址中的值
c.指针可以被const修饰成为常量或者只读变量。
引用
引用只是一个变量的新名字。
a.对引用的操作(赋值,取地址)都会传递到代表的变量上
b.const引用使其代表的变量具有只读属性(const修饰的引用是只读变量,但指针还有常量)
c.引用必须在定义时初始化,之后无法代表其他变量。
从使用c++语言的角度来看
a.引用与指针没有任何关系
b.引用是变量的新名字,操作引用就是操作对应的变量
从c++编译器的角度来看
a.为了支持新概念“引用”必须要一个有效的解决方案
b.在编译器内部,使用指针常量来实现“引用”
c.因此“引用”在定义时必须初始化
在工程项目开发中
a.当进行c++编程是,直接站在使用的角度看待引用,与指针毫无关系,引用就是变量的别名
b.当对c++代码进行调试分析时,一些特殊情况,可以考虑站在c++编译器的角度看待引用。
思考:下面的代码有问题吗?
int a = 1;
int b = 2;
int *pc = new int(3); //定义一个指针,分配空间并赋值
int& array[] = {a, b, *pc};
测试:
#include <stdio.h>
int a = 1;
struct SV
{
int& x;
int& y;
int& z;
};
int main()
{
int b = 2;
int* pc = new int(3);
SV sv = {a, b, *pc};
int& array[] = {a, b, *pc}; // error &array[1] - &array[0] = ? Expected ==> 4
printf("&sv.x = %p\n", &sv.x);
printf("&sv.y = %p\n", &sv.y);
printf("&sv.z = %p\n", &sv.z);
delete pc;
return 0;
}

数组中的每一个元素都是顺序存放的,也就是说他们的地址是递增的。可从测试结果中看到。&array[1] - &array[0] = ? Expected ==> 4。所以c++中不支持引用数组。当然结构体支持(struct SV)。
第12课.经典问题解析(const;指针和引用)的更多相关文章
- 第24课.经典问题解析(1.析构函数的顺序;2.const修饰对象;3.成员函数,成员变量是否属于具体对象)
1.当程序中存在多个对象的时候,如何确定这些对象的析构顺序? 单个对象 单个对象创建时构造函数的调用顺序 a.调用父类的构造函数 b.调用成员变量的构造函数(调用顺序与声明顺序相同) c.调用类自身的 ...
- const成员函数可以将非const指针作为返回值吗?
先给出一段代码 class A { int *x; public: int *f() const { return x; } }; 成员函数f返回指向私有成员 x 的非常量指针,我认为这会修改成员x ...
- Angular 2的12个经典面试问题汇总(文末附带Angular测试)
Angular作为目前最为流行的前端框架,受到了前端开发者的普遍欢迎.不论是初学Angular的新手,还是有一定Angular开发经验的开发者,了解本文中的12个经典面试问题,都将会是一个深入了解和学 ...
- Angular的12个经典问题,看看你能答对几个?(文末附带Angular测试)
Angular作为目前最为流行的前端框架,受到了前端开发者的普遍欢迎.不论是初学Angular的新手,还是有一定Angular开发经验的开发者,了解本文中的12个经典面试问题,都将会是一个深入了解和学 ...
- Angular 2的12个经典面试问题汇总(文末附带Angular測试)
Angular作为眼下最为流行的前端框架,受到了前端开发者的普遍欢迎.不论是初学Angular的新手.还是有一定Angular开发经验的开发者,了解本文中的12个经典面试问题,都将会是一个深入了解和学 ...
- const 指针的三种使用方式
///////////////////////const 指针的三种状态///////////////////// 注意:const 的前后顺序 const 在类型之前 ---可以修改指针包含的地址, ...
- C++-const_cast只能用于指针和引用,对象的const到非const可以用static_cast
Static_cast可以对对象也可以对指针也可以对引用,但是const_cast只可以对指针和引用使用,后者不可以对对象用,如果你要把一个const值转化为非const值只能用隐式执行或通过使用st ...
- C++的引用与const指针的关系以及各种传递方式
首先我们知道 const int *p 与 int const *p 是一样的,即 *p 是常量:而 int * const p 跟上面是不一样的,即 p 是常量:我们知道引用只是一个别名,与变量共享 ...
- const指针与指向const的指针
当使用带有const的指针时其实有两种意思.一种指的是你不能修改指针本身的内容,另一种指的是你不能修改指针指向的内容.听起来有点混淆一会放个例子上来就明白了. 先说指向const的指针,它 ...
随机推荐
- 【Android-关闭所有Activity】关闭activity之前的所有activity,重启actibity
Android关闭activity之前的所有activity,重启actibity 直接关闭一个activity之前的所有Activity页面 解决方法:清理activity堆栈 Intent ine ...
- sourceinsight 头文件和函数注释的宏实现
插入文件注释代码实现 macro InsertFileComment() { hbuf = GetCurrentBuf() ln = szName = "pengchao" szC ...
- python sqlite3查询表记录
1.查询数据库log_info表最后10条记录. desc - 指"降序" 解决的方法是:按照ID 逆序排列,选取前10个 select * from 'log_info' ord ...
- C++11正则表达式初探
C++正则表达式 在此之前都没有了解过C++的正则,不过现在大多数赛事都支持C++11了,因此有必要学习一下,用于快速A签到题. 所在头文件 #include<regex> 正则表达式语法 ...
- Python,初次见面请多指教
特点 1.可读性强: 可读性远比听上去重要的多得多.一个程序会被反复的修改,可读性强意味着让你可以在更短的时间内学习和记忆,直接提高生产率. 2.简洁,简洁,简洁: 研究证明,程序员每天可编写的有效代 ...
- Python之Javascript
1.JavaScript 被设计用来向 HTML 页面添加交互行为. 2.JavaScript 是一种脚本语言(脚本语言是一种轻量级的编程语言). 3.JavaScript 由数行可执行计算机代码组成 ...
- PPT:很多文字如何排版?(PPT如何美化?)
1.加入图标.形状(或者加入图片和色块搭配) 2.提取关键词作为标题(这个很重要) 下面看下示例: 这个是没修改前 修改后: 相信大家都会喜欢第二张吧 再看一个: 最近在学做PPT,有点上瘾了,哈哈哈 ...
- shift and add算法相关
1.超分辨率 非均匀插值 Farsiu S, Robinson D, Milanfar P. Robust shift and add approach to superresolution[J]. ...
- 前端知识扫盲-VUE知识篇一(VUE核心知识)
最近对整个前端的知识做了一次复盘,总结了一些知识点,分享给大家有助于加深印象. 想要更加理解透彻的同学,还需要大家自己去查阅资料或者翻看源码.后面会陆续的更新一些相关注知识点的文章. 文章只提出问题, ...
- LC 740. Delete and Earn
Given an array nums of integers, you can perform operations on the array. In each operation, you pic ...