【6. 深入理解 C++ 中的常量】

本章目录:

    • 前言
    • 1. 常量概述
    • 2. 常量类型解析与示例
      • 2.1 整数常量
      • 2.2 浮点常量
      • 2.3 布尔常量
      • 2.4 字符与转义字符
      • 2.5 字符串常量
    • 3. 定义常量的两种方式
      • 3.1 使用 `#define`
      • 3.2 使用 `const`
    • 4. 深入理解宏与 `const` 的区别
      • 4.1 类型与安全检查
      • 4.2 编译器处理阶段
      • 4.3 存储与作用域
    • 5. `const` 的高级用法与实践
      • 5.1 修饰指针
      • 5.2 修饰函数参数
      • 5.3 修饰类成员函数
      • 5.4 返回值为 `const`
    • 总结


前言

在 C++ 中,常量是指程序执行期间不可更改的固定值(字面量)。合理使用常量能够提升代码的可读性、安全性和维护性。本文将从常量的基础知识入手,结合使用场景与创新实践,全面剖析常量的方方面面。


1. 常量概述

常量可分为以下几类:

  • 整数常量:十进制、八进制、十六进制。
  • 浮点常量:小数形式或科学计数法形式。
  • 布尔常量truefalse
  • 字符常量:单引号括起来的字符,支持转义序列。
  • 字符串常量:双引号括起来的字符序列。

常量定义后不可更改,与变量相比增加了数据安全性。


2. 常量类型解析与示例

2.1 整数常量

整数常量可以通过基数前缀区分:

  • 十进制:直接书写,如 123
  • 八进制:以 0 开头,如 0123
  • 十六进制:以 0x0X 开头,如 0x7B

后缀修饰符:

  • U(无符号)、L(长整型),顺序不限,大写小写均可。

示例:

int main() {unsigned int decimal = 215u; // 十进制无符号整数long hexValue = 0xFeeL;      // 十六进制长整型return 0;
}

2.2 浮点常量

浮点常量可表示为小数或科学计数法形式。科学计数法使用 eE 表示指数部分。

示例:

int main() {double pi = 3.14159;          // 小数形式double largeNumber = 2.5E4;   // 科学计数法return 0;
}

2.3 布尔常量

布尔常量仅有两个值:truefalse

int main() {bool isValid = true;return 0;
}

2.4 字符与转义字符

字符常量包括普通字符、转义字符和 Unicode 字符。例如:

char newline = '\n';   // 换行符
char unicode = '\u03A9'; // Unicode 字符:希腊字母 Omega

转义序列表:

转义序列描述
\\反斜杠
\n换行符
\t水平制表符
\'单引号
\"双引号

示例:

#include <iostream>
using namespace std;int main() {cout << "Hello\tWorld\n";return 0;
}

2.5 字符串常量

字符串由双引号括起来。可使用 \ 分隔长字符串:

string message = "Hello, \
World!";

3. 定义常量的两种方式

3.1 使用 #define

#define 是一种预处理器指令,用于宏替换:

#define PI 3.14
#define GREETING "Hello, World!"

优点:

  • 简单明了,无需声明类型。

缺点:

  • 不支持类型检查。
  • 调试困难。

实例:

#define LENGTH 10
#define WIDTH 5int main() {int area = LENGTH * WIDTH;cout << "Area: " << area << endl;return 0;
}

3.2 使用 const

const 声明类型安全的常量:

const double PI = 3.14;
const char NEWLINE = '\n';

优点:

  • 类型安全,支持编译期检查。
  • 能与作用域、内存分配机制配合使用。

实例:

int main() {const int LENGTH = 10;const int WIDTH = 5;cout << "Area: " << LENGTH * WIDTH << endl;return 0;
}

4. 深入理解宏与 const 的区别

4.1 类型与安全检查

  • 宏定义仅做文本替换,无类型检查。
  • const 是编译器语义,提供类型检查。

4.2 编译器处理阶段

  • 宏定义在预处理阶段展开。
  • const 常量在编译阶段生成类型安全的只读变量。

4.3 存储与作用域

  • 宏定义无内存分配,作用域不限。
  • const 常量存储于程序的数据段中,作用域受定义位置限制。

示例对比:

#include <iostream>
using namespace std;void test() {#define MACRO 10const int CONSTANT = 10;
}void compare() {cout << MACRO << endl; // 正确,宏定义全局有效// cout << CONSTANT << endl; // 错误,超出作用域
}

5. const 的高级用法与实践

5.1 修饰指针

const int* ptr1; // 指向的值不可修改
int* const ptr2; // 指针本身不可修改
const int* const ptr3; // 值和指针都不可修改

5.2 修饰函数参数

void printMessage(const string& message) {cout << message << endl; // 只读参数
}

5.3 修饰类成员函数

class Example {
public:void display() const {// 不能修改类成员变量}
};

5.4 返回值为 const

const string& getMessage() {static string msg = "Hello";return msg;
}

总结

C++ 中的常量不仅能提升代码安全性与可读性,还在现代编程中提供了丰富的灵活性。通过灵活应用 const 和宏定义,可以构建类型安全、高效且维护性强的代码。

最佳实践:

  • 在大多数场景下,优先使用 const 替代 #define
  • 对需要严格不可修改的数据,使用 const 修饰。
  • 合理设置作用域,避免不必要的全局常量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/11838.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPT与Deepseek等数据驱动AI的缺点

当前数据驱动的AI&#xff08;包括GPT与Deepseek等各种大小模型&#xff09;只进行了数/物理性的初步探索&#xff0c;尚未触及人机环境生态系统的复杂性。也就是说&#xff0c;当前的数据驱动型 AI&#xff0c;虽然在处理大量数据、解决特定任务方面取得了显著进展&#xff0c…

阿里云盘PC端打不开解决办法

阿里云盘服务中心 搜索&#xff1a;PC端无法启动怎么办 选择问题 PC端双击云盘图标没有反应&#xff08;windows系统&#xff09; 下载null.sys&#xff0c;先执行压缩包里面的 null.reg 注册表&#xff0c;再按官方文档操作&#xff0c;不然会报错&#xff0c;搞完建议重启一…

树莓派pico入坑笔记,故障解决:请求 USB 设备描述符失败,故障码(43)

今天心血来潮&#xff0c;拿出吃灰的pico把玩一下&#xff0c;打开thonny&#xff0c;上电&#xff0c;然后...... 上电识别不到端口&#xff0c;windows报错&#xff0c;请求 USB 设备描述符失败&#xff0c;故障码&#xff08;43&#xff09; 一开始以为是坏了&#xff08;磕…

Linux——文件系统

一、从硬件出发 1&#xff09;磁盘的主要构成 通常硬盘是由盘片、主轴、磁头、摇摆臂、马达、永磁铁等部件组成&#xff0c;其中一个硬盘中有多块盘片和多个磁头&#xff0c;堆叠在一起&#xff0c;工作时由盘片旋转和摇摆臂摇摆及逆行寻址从而运作&#xff0c;磁头可以对盘片…

FPGA 时钟多路复用

时钟多路复用 您可以使用并行和级联 BUFGCTRL 的组合构建时钟多路复用器。布局器基于时钟缓存 site 位置可用性查找最佳布局。 如果可能&#xff0c;布局器将 BUFGCTRL 布局在相邻 site 位置中以利用专用级联路径。如无法实现&#xff0c;则布局器将尝试将 BUFGCTRL 从…

C++底层学习预备:模板初阶

文章目录 1.编程范式2.函数模板2.1 函数模板概念2.2 函数模板原理2.3 函数模板实例化2.3.1 隐式实例化2.3.2 显式实例化 2.4 模板参数的匹配原则 3.类模板希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01; 进入STL库学习之前我们要先了解有关模板的…

Baklib如何在知识管理领域成为领军者与六款产品的综合评析

内容概要 在知识管理领域&#xff0c;Baklib凭借其卓越的技术和创新的产品线&#xff0c;已经确立了行业的领导地位。作为一个全面的知识管理平台&#xff0c;Baklib为企业提供了高效、便捷的知识存储和管理方案&#xff0c;帮助组织有效整合内外部知识资源。其主要特点包括强…

Baklib阐明企业内容管理与内容中台的本质差异

内容概要 在快速发展的数字时代&#xff0c;企业对信息的管理愈加重视。内容管理在企业日常运营中扮演了重要角色&#xff0c;而随着技术的不断进步&#xff0c;内容中台的概念逐渐走入视野。了解这两者的不同&#xff0c;不仅有助于企业更有效地管理内容&#xff0c;还能提升…

Java 大视界 -- Java 大数据在智能电网中的应用与发展趋势(71)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

deepseek 本地化部署和小模型微调

安装ollama 因为本人gpu卡的机器系统是centos 7, 直接使用ollama会报 所以ollama使用镜像方式进行部署&#xff0c; 拉取镜像ollama/ollama 启动命令 docker run -d --privileged -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama 查看ollama 是否启动…

【腾讯前端面试】纯css画图形

之前参加腾讯面试&#xff0c;第一轮是笔试&#xff0c;面试官发的试卷里有一题手写css画一个扇形、一个平行四边形……笔试时间还是比较充裕的&#xff0c;但是我对这题完全没有思路&#x1f62d;于是就空着了&#xff0c;最后也没过。 今天偶然翻到廖雪峰大佬的博客里提到了关…

物联网 STM32【源代码形式-ESP8266透传】连接OneNet IOT从云产品开发到底层MQTT实现,APP控制 【保姆级零基础搭建】

一、MQTT介绍 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;是一种基于发布/订阅模式的轻量级通讯协议&#xff0c;构建于TCP/IP协议之上。它最初由IBM在1999年发布&#xff0c;主要用于在硬件性能受限和网络状况不佳的情…

探秘Linux IO虚拟化:virtio的奇幻之旅

在当今数字化时代&#xff0c;虚拟化技术早已成为推动计算机领域发展的重要力量。想象一下&#xff0c;一台物理主机上能同时运行多个相互隔离的虚拟机&#xff0c;每个虚拟机都仿佛拥有自己独立的硬件资源&#xff0c;这一切是如何实现的呢&#xff1f;今天&#xff0c;就让我…

MATLAB实现单层竞争神经网络数据分类

一.单层竞争神经网络介绍 单层竞争神经网络&#xff08;Single-Layer Competitive Neural Network&#xff09;是一种基于竞争学习的神经网络模型&#xff0c;主要用于数据分类和模式识别。其核心思想是通过神经元之间的竞争机制&#xff0c;使得网络能够自动学习输入数据的特…

网络协议基础

文章目录 前言一、网络协议分层1.应用层2.传输层3.网络层4.数据链路层5.物理层 二、图解IP1.IP基本认识&#xff08;1&#xff09;IP的作用&#xff08;2&#xff09;IP与MAC的关系 2.IP地址的基础知识&#xff08;1&#xff09;IP地址的定义&#xff08;2&#xff09;IP地址的…

(CICD)自动化构建打包、部署(Jenkins + maven+ gitlab+tomcat)

一、平滑发布与灰度发布 **什么叫平滑&#xff1a;**在发布的过程中不影响用户的使用&#xff0c;系统不会因发布而暂停对外服务&#xff0c;不会造成用户短暂性无法访问&#xff1b; **什么叫灰度&#xff1a;**发布后让部分用户使用新版本&#xff0c;其它用户使用旧版本&am…

【C语言】自定义类型讲解

文章目录 一、前言二、结构体2.1 概念2.2 定义2.2.1 通常情况下的定义2.2.2 匿名结构体 2.3 结构体的自引用和嵌套2.4 结构体变量的定义与初始化2.5 结构体的内存对齐2.6 结构体传参2.7 结构体实现位段 三、枚举3.1 概念3.2 定义3.3 枚举的优点3.3.1 提高代码的可读性3.3.2 防止…

deep generative model stanford lecture note3 --- latent variable

1 Introduction 自回归模型随着gpt的出现取得很大的成功&#xff0c;还是有很多工程上的问题并不是很适合使用自回归模型&#xff1a; 1&#xff09;自回归需要的算力太大&#xff0c;满足不了实时性要求&#xff1a;例如在自动驾驶的轨迹预测任务中&#xff0c;如果要用纯自回…

变形金刚多元宇宙

涉及的公司&#xff1a; 日本Takara公司 Diaclone可变形机器人玩具 Microman可变形机器人玩具 孩之宝 孩之宝与Takara签订协议后&#xff0c;孩之宝开始使用Takara的专利进行研发。 漫威 为了推广玩具&#xff0c;1984年5月&#xff0c;孩之宝玩具与漫威《变形金刚》漫画试探…

Day33【AI思考】-分层递进式结构 对数学数系的 终极系统分类

文章目录 **分层递进式结构** 对数学数系的 **终极系统分类**总览**一、数系演化树&#xff08;纵向维度&#xff09;**数系扩展逻辑树**数系扩展逻辑** **二、代数结构对照表&#xff08;横向维度&#xff09;**数系扩展的数学意义 **三、几何对应图谱&#xff08;空间维度&am…