C++ const 常量完整用法详解

 更新时间:2026年06月13日 10:13:15   作者:C+++Python  
在C++中,const关键字用于声明一个常量,即在编译时就已经确定其值的变量,使用const可以使代码更加健壮和易于理解,因为它可以防止某些类型的修改,从而提高代码的安全性,下面是一些关于如何在C++中使用const的完整用法和示例,

const 用于修饰只读对象,被修饰后值不可修改,有类型、作用域,是 C++ 主力常量用法。下面分场景逐一讲解。

一、基础:修饰普通变量(常量变量)

1. 基本语法

const 类型 变量名 = 初始值;

强制要求:必须初始化,定义后不能再赋值修改。

#include <iostream>
using namespace std;
int main()
{
    const int num = 100;
    const double pi = 3.14159;
    // num = 200;  // 编译报错:const 只读,无法修改
    cout << num << " " << pi << endl;
    return 0;
}

2. 作用域规则

  • 局部 const:定义在函数/代码块内,仅当前作用域有效。
  • 全局 const:默认仅当前源文件可见(内部链接),和普通全局变量不同。
    • 若要跨文件使用,加 extern
// 文件A.cpp
extern const int g_val = 10;
// 文件B.cpp
extern const int g_val; // 声明,可使用

3. 用变量初始化 const

const 可以是运行时常量,允许用普通变量初始化:

int a = 20;
const int b = a; // 合法,运行时确定值

二、重点:const + 指针(三大组合,高频考点)

根据 const 位置不同,含义完全不同,分三类记忆。

1. 常量指针(const修饰指向的内容)

格式:const 类型* 指针名

  • 指针本身可以改指向
  • 指针指向的数据不能修改
int x = 1, y = 2;
const int* p = &x;
p = &y;        // ✅ 指针指向可以变
// *p = 100;   // ❌ 指向的值不能修改

2. 指针常量(const修饰指针本身)

格式:类型* const 指针名

  • 指针本身不能改指向(必须初始化)
  • 指针指向的数据可以修改
int x = 1;
int* const p = &x; // 定义时必须初始化
*p = 100;      // ✅ 内容可改
// p = &y;     // ❌ 指针指向不能变

3. 双重 const(内容、指针都只读)

格式:const 类型* const 指针名

  • 指针指向 不能改
  • 指向的数据 不能改
int x = 1;
const int* const p = &x;
// *p = 100;  ❌
// p = &y;    ❌

快速判断技巧:const 靠近谁,谁就不能改

三、const 修饰引用

引用本身等价于变量别名,const 修饰引用表示不能通过引用修改原数据
格式:const 类型& 引用名

int a = 10;
const int& r = a;

// r = 20;  // ❌ 不能通过引用修改 a
a = 20;    // ✅ 原变量本身可以修改

常用场景:函数传参,避免拷贝 + 保护数据。

四、const 修饰函数(分:参数、返回值、成员函数)

1. 修饰函数形参

目的:保护实参不被函数修改,推荐搭配引用/指针使用,减少拷贝。

// 不允许修改传入的字符串
void print(const string& s)
{
    cout << s << endl;
    // s = "test"; 报错
}

2. 修饰函数返回值

一般用于返回指针/引用,防止外部修改返回的内容:

const int& getVal(int& a)
{
    return a;
}
int main()
{
    int x = 10;
    const int& res = getVal(x);
    // res = 20; 报错
    return 0;
}

普通值返回加 const 无意义。

3. 修饰类的成员函数(类专属用法)

const 写在函数参数列表后面,表示:

该函数不会修改类的任何成员变量,也不能调用非 const 成员函数。

语法:

返回值 函数名(参数) const;

示例:

class Test
{
private:
    int num = 10;
public:
    // const 成员函数
    void show() const
    {
        cout << num << endl;
        // num = 20;  ❌ 不能修改成员变量
    }
};

规则:

  1. const 成员函数内,禁止修改成员变量
  2. const 对象只能调用 const 成员函数。
  3. const 成员函数不能调用普通(非 const)成员函数。

五、const 修饰类成员变量

类内 const 成员变量,必须在构造函数初始化列表初始化,不能在构造函数体内赋值。

class A
{
private:
    const int val; // const 成员
public:
    // 只能在初始化列表赋值
    A() : val(100) 
    {
        // val = 100;  ❌ 体内赋值报错
    }
};

六、补充:const 与 类型转换、const _cast

  1. const 变量不能直接转普通变量,强行修改属于未定义行为。
  2. 若临时需要去除只读属性,可用 const_cast(谨慎使用):
const int a = 10;
int* p = const_cast<int*>(&a);
*p = 20; // 不推荐,修改原 const 常量是未定义行为

七、const 总结速记

  1. 普通变量:const 类型 变量 = 值,只读不可改。
  2. 指针:
    • const T*:内容不可改,指针可改
    • T* const:指针不可改,内容可改
    • const T* const:全都不可改
  3. 引用:const T&,禁止通过引用改原数据。
  4. 函数参数:const 保护实参,优先引用传参。
  5. 类成员函数:尾部加 const,承诺不修改成员。
  6. 类 const 成员变量:必须在初始化列表初始化。

到此这篇关于C++ const 常量完整用法详解的文章就介绍到这了,更多相关C++ const 常量用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言使用矩形法求定积分的通用函数

    C语言使用矩形法求定积分的通用函数

    这篇文章主要为大家详细介绍了C语言使用矩形法求定积分的通用函数,分别求解sinx, cosx,e^x,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • C语言实现BMP图像开运算处理

    C语言实现BMP图像开运算处理

    这篇文章主要为大家详细介绍了C语言实现BMP图像开运算处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • C++中使用cout以hex格式输出方式

    C++中使用cout以hex格式输出方式

    这篇文章主要介绍了C++中使用cout以hex格式输出方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C语言学好递归看这一篇就够了

    C语言学好递归看这一篇就够了

    递归指的是在函数的定义中使用函数自身的方法,举个例子: 从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?"从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?"从前有座山,山里有座庙,循环下去
    2021-10-10
  • 使用C++制作简单的web服务器(续)

    使用C++制作简单的web服务器(续)

    本文承接上文《使用C++制作简单的web服务器》,把web服务器做的功能稍微强大些,主要增加的功能是从文件中读取网页并返回给客户端,而不是把网页代码写死在代码中,有需要的小伙伴来参考下吧。
    2015-03-03
  • 详解C语言中的错误报告errno与其相关应用方法

    详解C语言中的错误报告errno与其相关应用方法

    这篇文章主要介绍了C语言中的错误报告errno与其相关应用方法,包括errno和strerror以及perror的介绍,需要的朋友可以参考下
    2015-08-08
  • C语言中读写交替时出现的问题分析

    C语言中读写交替时出现的问题分析

    读写命令交替,一定要使用fseek重新定位,否则出现输入显示混乱,这篇文章主要介绍了C语言中读写交替时出现的问题分析,需要的朋友可以参考下
    2022-12-12
  • C++ vector容器实现贪吃蛇小游戏

    C++ vector容器实现贪吃蛇小游戏

    这篇文章主要为大家详细介绍了C++ vector容器实现贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • C语言 表、栈和队列详解及实例代码

    C语言 表、栈和队列详解及实例代码

    这篇文章主要介绍了C语言 表、栈和队列详解及实例代码的相关资料,需要的朋友可以参考下
    2017-02-02
  • 使用C/C++访问MySQL的教程详解

    使用C/C++访问MySQL的教程详解

    在实际开发中,语言连接MySQL是为了能够在编程语言中与MySQL数据库进行交互和操作,大部分情况我们都是通过语言连接MySQL,建立与MySQL数据库的连接,本篇文章主要讲解使用C/C++访问MySQL的教程,需要的朋友可以参考下
    2024-08-08

最新评论