CONST &的新手疑问

qq_24037893 2017-12-31 05:32:10
#include<iostream>
#include<iomanip>
using namespace std;
int main() {

int a = 0;
const int& b = a;
cout << a << setw(10) << &a << endl;
cout << b << setw(10) << &b << endl;


a = 1;//给a赋值;
cout << a << setw(10) << &a << endl;
cout << b << setw(10) << &b << endl;

b = 1; //表达式必须是可修改的左值
cout << a << setw(10) << &a << endl;
cout << b << setw(10) << &b << endl;

system("pause");
return 0;
}




对此我作为一个新手表示疑惑,b作为a的引用别名,只想同一个内存地址00D9FC84,为什么可以通过a改变此内存地址中存放的数据值,然而b作为a的const别名,却无法改变此内存地址的存放数据值 对此我个人猜想了几个问题所在点:
1. 变量名和其对应内存地址的关系我完全弄明白。。。。。。。
2. 一个内存是否只读CONST是可以改变的。。。。。。。。。

新手发帖,多加指教!
...全文
548 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
真相重于对错 2020-03-11
  • 打赏
  • 举报
回复
const T 非常有意思。例如大家都认为,const 变量会存储在常量区。这个说法不完全正确,当你的程序绝不会对const 变量取地址的时候,编译器可能不会存储它,例如: const int b =10; .... fun(b) ; 这样的代码,编译后可能是 fun(10); 就像我上边所说,const T 只在编译期起到作用,如果你通过某种手段,绕过编译时对const的限制,比如通过引用,取址获得const变量的具体存储。你完全可以写那些const变量。
真相重于对错 2020-03-11
  • 打赏
  • 举报
回复
const 作用是在编译期间的.
功夫兔Mook 2020-03-10
  • 打赏
  • 举报
回复
const的作用就是不可改变,当然:const int 此类型定义的变量的内存地址是不可改变的,但是内存中所存的值是可以发生改变的。
缘来是梦 2018-01-09
  • 打赏
  • 举报
回复
引用 1 楼 qq_24037893 的回复:
C++ primer 第五版 56页 对const的引用可能引用一个并非const的对象 必须认识到,常量引用仅对引用可参与的操作做出了限定,对引用的对象本身是不是一个常量并未作限定。因为对象也可能是个非常量,所以允许通过其他非CONST&途径改变它的值 意思就像我上面的问题一样,可以通过a改变那个内存地址中的数据值,不允许通过b 对此我个人自己找到这个答案,然而我更加疑惑了CONST到底是什么意思,这就是C++的所谓的坑吗?好深啊。。。。。
const 限定是 b, b 是对 a 的一个只读引用. 也就是说通过 b 只能读取 a的数据, 而不修改它. 并没有改变a 本身的属性. 这只是从语法和主义上来规范我们的编程行为, 至于其他技术手段访问内存的, 不在此范围内!
dyycdyyc 2018-01-08
  • 打赏
  • 举报
回复
const限定符的意义是“不允许对这个符号进行再次赋值”,而不是“保证这块内存的值不变” 编译器只会管你有没有对const修饰的符号进行修改,至于实际内存发生了什么,它不管也不会知道 这个限定符的主要作用就是告知编程人员,这是个不能改的量,防止程序员手滑改了不能动的东西 这不是坑,本来就是这么用的
赵4老师 2018-01-04
  • 打赏
  • 举报
回复
不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!
codedoctor 2018-01-04
  • 打赏
  • 举报
回复
楼上说的有点道理。学习C++,最主要的就是认识到你写的const、int等 都只是编译器的一种标志,而不是实际上的内存空间。当你加上const之后,就是告诉编译器不允许修改这个变量的值。所以虽然b就是a的别名,但是你告诉了编译器这个别名是不可修改的,所以就在编译时不允许你去对这个别名进行赋值。
xskxzr 2018-01-04
  • 打赏
  • 举报
回复
你的程序并不是在直接访问你的内存。 你的程序通过编译器编译成机器语言,真正访问内存的是这些机器语言指令。 甚至你所认为的访问“内存”(这里用引号,是因为C++语言语义里的内存和真实内存并不一样,这里指前者)的语句,经过编译器的翻译,在机器语言里可能对应看上去完全不相关的指令。 const是C++语言层面上的限制,不是访问内存层面的限制。
qq_24037893 2017-12-31
  • 打赏
  • 举报
回复
C++ primer 第五版 56页 对const的引用可能引用一个并非const的对象 必须认识到,常量引用仅对引用可参与的操作做出了限定,对引用的对象本身是不是一个常量并未作限定。因为对象也可能是个非常量,所以允许通过其他非CONST&途径改变它的值 意思就像我上面的问题一样,可以通过a改变那个内存地址中的数据值,不允许通过b 对此我个人自己找到这个答案,然而我更加疑惑了CONST到底是什么意思,这就是C++的所谓的坑吗?好深啊。。。。。
Node.js 是一个开源与跨平台的 JavaScript 运行时环境。 它是一个可用于几乎任何项目的流行工具!   Node.js 在浏览器外运行 V8 JavaScript 引擎(Google Chrome 的内核)。 这使 Node.js 表现得非常出色。   Node.js 应用程序运行于单个进程中,无需为每个请求创建新的线程。 Node.js 在其标准库中提供了一组异步的 I/O 原生功能(用以防止 JavaScript 代码被阻塞),并且 Node.js 中的库通常是使用非阻塞的范式编写的(从而使阻塞行为成为例外而不是规范)。   当 Node.js 执行 I/O 操作时(例如从网络读取、访问数据库或文件系统),Node.js 会在响应返回时恢复操作,而不是阻塞线程并浪费 CPU 循环等待。   这使 Node.js 可以在一台服务器上处理数千个并发连接,而无需引入管理线程并发的负担(这可能是重大 bug 的来源)。   Node.js 具有独特的优势,因为为浏览器编写 JavaScript 的数百万前端开发者现在除了客户端代码之外还可以编写服务器端代码,而无需学习完全不同的语言。   在 Node.js 中,可以毫无问题地使用新的 ECMAScript 标准,因为不必等待所有用户更新其浏览器,你可以通过更改 Node.js 版本来决定要使用的 ECMAScript 版本,并且还可以通过运行带有标志的 Node.js 来启用特定的实验中的特性。   大量的库 npm 的简单结构有助于 Node.js 生态系统的激增,现在 npm 仓库托管了超过 1,000,000 个可以自由使用的开源库包。   Node.js 应用程序的示例 Node.js zui常见的 Hello World 示例是 Web 服务器:   const http = require('http')const hostname = '127.0.0.1'const port = 3000const server = http.createServer((req, res) => )server.listen(port, hostname, () => ) 此代码首先引入了 Node.js http 模块。   Node.js 具有出色的标准库,包括对网络的一.流支持。   http 的 createServer() 方法会创建新的 HTTP 服务器并返回它。   服务器被设置为监听指定的端口和主机名。 当服务器就绪后,回调函数会被调用,在此示例中会通知我们服务器正在运行。   每当接收到新的请求时,request 事件会被调用,并提供两个对象:一个请求(http.IncomingMessage 对象)和一个响应(http.ServerResponse 对象)。   这两个对象对于处理 HTTP 调用至关重要。   第一个对象提供了请求的详细信息。 在这个简单的示例中没有使用它,但是你可以访问请求头和请求数据。   第二个对象用于返回数据给调用方。   在此示例中:   res.statusCode = 200 设置 statusCode 属性为 200,以表明响应成功。   设置 Content-Type 响应头:   res.setHeader('Content-Type', 'text/plain') 关闭响应,添加内容作为 end() 的参数:   res.end('你好世界n') Node.js 框架和工具 Node.js 是一个底层的平台。 为了使开发者做事变得容易又来劲,社区在 Node.js 上构建了数千个库。   久而久之,其中许多已成为受欢迎的选择。 以下是一些值得学习的清单:   AdonisJs: 一个全栈框架,高度专注于开发者的效率、稳定和信任。 Adonis 是zui快的 Node.js Web 框架之一。   Express: 提供了创建 Web 服务器的zui简单但功能zui强大的方法之一。 它的极简主义方法,专注于服务器的核心功能,是其成功的关键。   Fastify: 一个 Web 框架,高度专注于提供zui佳的开发者体验(以zui少的开销和强大的插件架构)。 Fastify 是zui快的 Node.js Web 框架之一。   Gatsby: 一个基于 React、由 GraphQL 驱动的静态网站生成器,具有非常丰富的插件和启动器生态系统。   hapi: 一个富框架,用于构建应用程序和服务,使开发者可以专注于编写可重用的应用程序逻辑,而不必花费时间来搭建基础架构。   koa: 由 Express 背后的同一个团队构建,旨在变得更简单更轻巧。 新项目的诞生是为了满足创建不兼容的更改而又不破坏现有社区。   Loopback.io: 使构建需要复杂集成的现代应用程序变得容易。   Meteor: 一个强大的全栈框架,以同构的方式使用 JavaScript 构建应用(在客户端和服务器上共享代码)。 曾经是提供所有功能的现成工具,现在可以与前端库 React,Vue 和 Angular 集成。 也可以用于创建移动应用。   Micro: 提供了一个非常轻量级的服务器,用于创建异步的 HTTP 微服务。   NestJS: 一个基于 TypeScript 的渐进式 Node.js 框架,用于构建企业级的高效、可靠和可扩展的服务器端应用程序。   Next.js: 一个 React 框架,可为你提供生产所需的所有功能的zui佳开发者体验:混合静态和服务器渲染、TypeScript 支持、智能捆绑、路由预取等。   Nx: 使用 NestJS、Express、React、Angular 等进行全栈开发的工具包! Nx 有助于将开发工作从一个团队(构建一个应用程序)扩展到多个团队(在多个应用程序上进行协作)!   Sapper: Sapper 是一个用于构建各种规模的 Web 应用程序的框架,具有出色的开发体验和灵活的基于文件系统的路由。还提供 S.S.R等!   Socket.io: 一个实时通信引擎,用于构建网络应用程序。   Strapi: Strapi 是一个灵活的开源 Headless CMS,可使开发者可以自由选择自己喜欢的工具和框架,同时还允许编辑人员轻松地管理和分发其内容。 通过使管理面板和 API 可以通过插件系统进行扩展,Strapi 使全球zui大的公司能够加速内容交付,同时构建优美的数字体验。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧