C++ 常量完全指南:const、宏定义与最佳实践

常量的类型与用途

在编程中,常量是一种在程序执行过程中不能被修改的值。

C++支持两种不同类型的常量:

  • 命名常量:与标识符相关联的常量值,也称为符号常量
  • 字面量常量:与标识符无关的常量值

定义常量的方法

在C++中,有三种定义命名常量的方法:

  1. 常量变量(本课介绍)
  2. 对象类宏(在预处理器中使用)
  3. 枚举常量(在后续课程中介绍)

常量变量详解

基本用法

int main()
{
    int x { 4 }; // x 是一个非常量变量
    x = 5; // 使用赋值操作符将 x 的值改为 5

    return 0;
}

常量变量的定义

使用const关键字定义常量变量:

const double gravity { 9.8 };  // 推荐的 const 用法,放在类型之前
int const sidesInSquare { 4 }; // "east const" 风格,可以但不推荐

常量变量的使用规则

初始化要求

常量变量必须在定义时初始化:

int main()
{
    const double gravity; // 错误:常量变量必须初始化
    gravity = 9.9;       // 错误:常量变量不能被修改

    return 0;
}

函数参数与返回值

常量函数参数

#include <iostream>

void printInt(const int x)
{
    std::cout << x << '\n';
}

int main()
{
    printInt(5); // 5 将被用作 x 的初始化器
    printInt(6); // 6 将被用作 x 的初始化器

    return 0;
}

宏定义与常量变量的对比

预处理器宏示例

#include <iostream>

#define MY_NAME "Alex"

int main()
{
    std::cout << "My name is: " << MY_NAME << '\n';

    return 0;
}

宏定义的潜在问题

#include <iostream>

void someFcn()
{
    #define gravity 9.8
}

void printGravity(double gravity) // 可能导致编译错误
{
    std::cout << "gravity: " << gravity << '\n';
}

最佳实践与建议

常量使用原则

  1. 尽可能将变量定义为常量
  2. 优先使用常量变量而不是宏定义
  3. const关键字放在类型之前

多文件程序中的常量

在多文件程序中使用常量时的注意事项:

  • 集中定义常量
  • 使用适当的作用域
  • 考虑使用内联变量

类型限定符说明

const限定符

  • 用于声明常量变量
  • 修改类型的行为
  • 属于cv-限定符类别

volatile限定符

  • 用于特殊场景
  • 告知编译器值可能随时改变
  • 较少使用

注意:本文中的代码示例均遵循现代C++标准,建议在实际编程中遵循这些最佳实践。

关注公众号,回复"cpp-tutorial"

可领取价值199元的C++学习资料

公众号二维码

扫描上方二维码或搜索"cpp-tutorial"