当前位置: 首页 > article >正文

【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 5

int 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 10
    const 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.kler.cn/a/531911.html

相关文章:

  • 【LLM-agent】(task2)用llama-index搭建AI Agent
  • 在CentOS服务器上部署DeepSeek R1
  • 【华为OD-E卷 - 磁盘容量排序 100分(python、java、c++、js、c)】
  • Kafka 压缩算法详细介绍
  • 2 MapReduce
  • Ollama部署指南
  • G1. Yunli‘s Subarray Queries (easy version)
  • Java 大视界 -- Java 大数据在智能电网中的应用与发展趋势(71)
  • 2月3日星期一今日早报简报微语报早读
  • 遭受大量境外网络攻击,郭盛华公开发声支持DeepSeek
  • 基于Spring Security 6的OAuth2 系列之十 - 授权服务器--刷新token
  • 优化代码性能:利用CPU缓存原理
  • 人工智能学习(五)之机器学习逻辑回归算法
  • DeepSeek-R1 本地部署教程(超简版)
  • SwiftUI 在 Xcode 预览修改视图 FetchedResults 对象的属性时为什么会崩溃?
  • DRM系列七:Drm之CREATE_DUMB
  • C++(进阶) 第8章unordered_map和unordered_set的使⽤(哈希)
  • 基于STM32景区环境监测系统的设计与实现(论文+源码)
  • 分布式数据库架构与实践:原理、设计与优化
  • 3 卷积神经网络CNN
  • ES6 入门教程:箭头函数、解构赋值及其他新特性详解
  • Gurobi求解旅行商问题的官方例程
  • 计网week3
  • 【LeetCode 刷题】回溯算法(5)-棋盘问题
  • Linux线程 —— 生产消费模型
  • 存储器知识点3