C++ 中的 const 知识点详解,c++和c语言区别

news2025/6/8 15:26:38

目录

  • 一。C++ 中的 const 知识点详解
    • 1. 基本用法
      • 1.1) 定义常量
      • 1.2) 指针与 const
    • 2. 函数中的 const
      • 2.1)const 参数
      • 2.2)const 成员函数
    • 3. 类中的 const
      • 3.1)const 成员变量
      • 3.2)const 对象
    • 4. const 返回值
    • 5. constexpr (C++11 引入)
    • 6. const 重载
    • 7. mutable 关键字
    • 8. const 引用与临时对象
    • 9. const 转换
    • 10. const 正确性的好处
    • 常见面试题
  • 二. C 语言中 const 的主要知识点
    • 1. 基本用法
      • 1.1)定义常量
      • 1.2)指针与 const
    • 2. 函数参数中的 const
    • 3. const 返回值
    • 4. 数组与 const
    • 5. 结构体与 const
    • 6. const 转换
    • 7. const 正确性的好处
    • 注意事项
    • 示例代码

一。C++ 中的 const 知识点详解

C++ 中的 const 知识点详解
const 是 C++ 中一个重要的关键字,用于定义常量或指定不可修改的对象。以下是关于 const 的全面知识点总结:

1. 基本用法

1.1) 定义常量

const int MAX_VALUE = 100;  // 常量,初始化后不可修改
// MAX_VALUE = 200;  // 错误:不能修改常量

1.2) 指针与 const

const int* ptr1;       // 指向常量对象的指针(指针指向的内容不可变)
int const* ptr2;       // 同上
int* const ptr3;       // 常量指针(指针本身不可变,但指向的内容可变)
const int* const ptr4; // 指向常量对象的常量指针(指针和内容都不可变)

2. 函数中的 const

2.1)const 参数

void print(const std::string& str) {
    // str 不能被修改
    std::cout << str << std::endl;
}

2.2)const 成员函数

class MyClass {
public:
    int getValue() const {  // 常量成员函数,不能修改成员变量
        return value_;
    }
    void setValue(int v) {  // 非常量成员函数
        value_ = v;
    }
private:
    int value_;
};

3. 类中的 const

3.1)const 成员变量

class MyClass {
public:
    MyClass(int v) : value_(v) {}  // 必须在初始化列表中初始化
private:
    const int value_;
};

3.2)const 对象

const MyClass obj(10);
// obj.setValue(20);  // 错误:不能调用非常量成员函数
int val = obj.getValue();  // 可以调用常量成员函数

4. const 返回值

const int* getPointer() {
    static int value = 42;
    return &value;
}
// 防止返回的指针被用于修改值

5. constexpr (C++11 引入)

constexpr int square(int x) {
    return x * x;
}
constexpr int size = square(10);  // 编译时常量

6. const 重载

void process(int& val) { /* ... */ }
void process(const int& val) { /* ... */ }


int getValue() const {  // 常量成员函数,不能修改成员变量
    return value_;
}
void setValue() {  // 非常量成员函数
    value_ = 10;
}

7. mutable 关键字

class MyClass {
public:
    void doSomething() const {
        count_++;  // mutable 成员可以在常量对象中被修改
    }
private:
    mutable int count_ = 0;
};

8. const 引用与临时对象

const std::string& getString() {
    return "Hello";  // 绑定到临时对象是安全的
}

9. const 转换

void print(const std::string& s);
 
std::string str = "test";
print(str);       // 正确:非常量可以转为常量
print("test");    // 正确:字符串字面量转为 const char*

10. const 正确性的好处

提高代码安全性:防止意外修改
明确编程意图
允许函数接受常量和非常量参数
优化机会:编译器可能进行更好的优化

常见面试题

1.const int*, int const* 和 int* const 的区别?
2. 如何在常量成员函数中修改成员变量?

mutable

3.为什么成员函数要有const 重载?

通过 const 重载,可以为一个类提供两种接口:一种用于修改对象,另一种用于只读访问。

4.const 和 constexpr 有什么区别?

const
表示“不可修改”,适用于运行时逻辑,防止意外修改对象或变量。
constexpr
表示“编译期常量”,适用于需要编译期优化的场景(如数组大小、模板参数),要求值必须在编译期确定。

二. C 语言中 const 的主要知识点

在 C 语言中,const 关键字用于定义常量或指定不可修改的对象。以下是关于 C 语言中 const 的主要知识点总结:

1. 基本用法

1.1)定义常量

const int MAX_VALUE = 100;  // 常量,初始化后不可修改
// MAX_VALUE = 200;  // 错误:不能修改常量

1.2)指针与 const

const int* ptr1;       // 指向常量对象的指针(指针指向的内容不可变)
int const* ptr2;       // 同上
int* const ptr3;       // 常量指针(指针本身不可变,但指向的内容可变)
const int* const ptr4; // 指向常量对象的常量指针(指针和内容都不可变)

2. 函数参数中的 const

void print(const char* str) {
    // str 不能被修改
    printf("%s\n", str);
}

3. const 返回值

const int* getPointer() {
    static int value = 42;
    return &value;
}
// 防止返回的指针被用于修改值

4. 数组与 const

const int arr[] = {1, 2, 3};  // 常量数组,内容不可修改
// arr[0] = 4;  // 错误:不能修改常量数组元素

5. 结构体与 const

5.1const 结构体成员

struct Point {
    const int x;
    const int y;
};
// 必须在初始化时赋值
struct Point p = {.x = 1, .y = 2};

5.2const 结构体变量

struct Point p = {1, 2};
const struct Point cp = p;
// cp.x = 3;  // 错误:不能修改常量结构体成员

6. const 转换

void print(const char* s);
 
char str[] = "test";
print(str);       // 正确:非常量可以转为常量
print("test");    // 正确:字符串字面量转为 const char*

7. const 正确性的好处

提高代码安全性:防止意外修改
明确编程意图
允许函数接受常量和非常量参数
优化机会:编译器可能进行更好的优化

注意事项

  • C 语言中的 const 变量默认具有外部链接性,除非显式声明为 static。
  • 在 C 语言中,const 变量并不是真正的常量表达式,不能用于数组大小声明等需要常量表达式的场合。
  • C 语言中的 const 变量可以通过指针间接修改(如果指针不是 const 限定的),这被认为是一个设计缺陷。

示例代码

#include <stdio.h>
 
int main() {
    const int a = 10;
    // a = 20;  // 错误:不能修改常量
 
    const int* ptr = &a;
    // *ptr = 30;  // 错误:不能通过 ptr 修改 a
 
    int b = 20;
    int* const ptr2 = &b;
    *ptr2 = 30;  // 正确:可以修改 b
    // ptr2 = &a;  // 错误:不能修改 ptr2
 
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《PyTorch:开启深度学习新世界的魔法之门》

一、遇见 PyTorch:深度学习框架新星登场 在当今的技术领域中,深度学习已然成为推动人工智能发展的核心动力,而深度学习框架则是这场技术革命中的关键工具。在众多深度学习框架里,PyTorch 以其独特的魅力和强大的功能,迅速崛起并占据了重要的地位,吸引着无数开发者和研究者…

分布式光纤传感(DAS)技术应用解析:从原理到落地场景

近年来&#xff0c;分布式光纤传感&#xff08;Distributed Acoustic Sensing&#xff0c;DAS&#xff09;技术正悄然改变着众多传统行业的感知方式。它将普通的通信光缆转化为一个长距离、连续分布的“听觉传感器”&#xff0c;对振动、声音等信号实现高精度、高灵敏度的监测。…

Spring事务回滚在系统中的应用

以文章发布为例&#xff0c;介绍Spring事务回滚在系统中的应用 事务回滚的核心概念 事务回滚是数据库管理系统中的关键机制&#xff0c;它确保数据库操作要么全部成功&#xff0c;要么全部失败。在Spring框架中&#xff0c;我们可以通过Transactional注解轻松实现事务管理。 …

ASP.NET Core使用Quartz部署到IIS资源自动被回收解决方案

iis自动回收的原因 回收机制默认配置&#xff0c;间隔时间是1740分钟&#xff0c;意思是&#xff1a;默认情况下每1740分钟(29小时)回收一次&#xff0c;定期检查应用程序池中的工作进程&#xff0c;并终止那些已经存在很长时间或已经使用了太多资源的工作进程 进程模型默认配…

调用.net DLL让CANoe自动识别串口号

1.前言 CANoe9.0用CAPL控制数控电源_canoe读取程控电源电流值-CSDN博客 之前做CAPL通过串口控制数控电源&#xff0c;存在一个缺点&#xff1a;更换电脑需要改串口号 CSDN上有类似的博客&#xff0c;不过要收费&#xff0c;本文根据VID和PID来自动获取串口号&#xff0c;代码…

算法(蓝桥杯学习C/C++版)

up: 溶金落梧桐 溶金落梧桐的个人空间-溶金落梧桐个人主页-哔哩哔哩视频 蓝桥杯三十天冲刺系列 BV18eQkY3EtP 网站&#xff1a; OI Wiki OI Wiki - OI Wiki 注意 比赛时&#xff0c;devc勾选c11&#xff08;必看&#xff09; 必须勾选c11一共有两个方法&#xff0c;任用…

Docker镜像无法拉取问题解决办法

最近再学习RabbitMQ&#xff0c;需要从Docker镜像中拉取rabbitMQ&#xff0c;但是下拉失败 总的来说就是无法和docker镜像远程仓库建立连接 我又去尝试ping docker.io发现根本没有反应&#xff0c;还是无法连接找了许多办法还是没有办法解决&#xff0c;最后才发现是镜像问题&a…

ZephyrOS 嵌入式开发Black Pill V1.2之Debug调试器

版本和环境信息如下&#xff1a; PC平台&#xff1a; Windows 11 专业版 Zephyr开发环境&#xff1a;v4.1.0 Windows 下搭建 Zephyr 开发环境 WeAct BlackPill V1.2开发板&#xff1a; WeAct STM32F411CEU6 BlackPill 核心板 Debug调试器&#xff1a; ST-LINK V2: ST-LINK V2 S…

服务器磁盘空间被Docker容器日志占满处理方法

事发场景&#xff1a; 原本正常的服务停止运行了&#xff0c;查看时MQTT服务链接失败&#xff0c;查看对应的容器服务发现是EMQX镜像停止运行了&#xff0c;重启也是也报错无法正常运行&#xff0c;报错如下图&#xff1a; 报错日志中连续出现两个"no space left on devi…

c++学习-this指针

1.基本概念 非静态成员函数都会默认传递this指针&#xff08;静态成员函数属于类本身&#xff0c;不属于某个实例对象&#xff09;&#xff0c;方便访问对象对类成员变量和 成员函数。 2.基本使用 编译器实际处理类成员函数&#xff0c;this是第一个隐藏的参数&#xff0c;类…

交易所系统攻坚:高并发撮合引擎与合规化金融架构设计

交易所系统攻坚&#xff1a;高并发撮合引擎与合规化金融架构设计 ——2025年数字资产交易平台的性能与合规双轮驱动 一、高并发撮合引擎&#xff1a;从微秒级延迟到百万TPS 核心架构设计 订单簿优化&#xff1a;数据结构创新&#xff1a;基于红黑树与链表混合存储&#xff0c…

OpenCV计算机视觉实战(10)——形态学操作详解

OpenCV计算机视觉实战&#xff08;10&#xff09;——形态学操作详解 0. 前言1. 腐蚀与膨胀1.1 为什么要做腐蚀与膨胀1.2 OpenCV 实现 2. 开运算与闭运算2.1 开运算与闭运算原理2.2 OpenCV 实现 3. 形态学梯度与骨架提取3.1 形态学梯度3.2 骨架提取 小结系列链接 0. 前言 形态…

[论文阅读] 人工智能 | 利用负信号蒸馏:用REDI框架提升LLM推理能力

【论文速读】利用负信号蒸馏&#xff1a;用REDI框架提升LLM推理能力 论文信息 arXiv:2505.24850 cs.LG cs.AI cs.CL Harnessing Negative Signals: Reinforcement Distillation from Teacher Data for LLM Reasoning Authors: Shuyao Xu, Cheng Peng, Jiangxuan Long, Weidi…

基于 NXP + FPGA+Debian 高可靠性工业控制器解决方案

在工业系统开发中&#xff0c;**“稳定”**往往比“先进”更重要。设备一旦部署&#xff0c;生命周期动辄 5~10 年&#xff0c;系统重启或异常恢复成本高昂。 这时候&#xff0c;一套“值得托付”的软硬件组合&#xff0c;就显得尤为关键。 ✅ NXP —— 提供稳定、长期供货的工…

垂起固定翼无人机应用及技术分析

一、主要应用行业 1. 能源基础设施巡检 电力巡检&#xff1a;适用于超高压输电线路通道的快速巡查&#xff0c;实时回传数据提升智能运检效率。 油田管道监测&#xff1a;利用长航时特性&#xff08;1.5-2小时&#xff09;对大范围管道进行隐患排查&#xff0c;减少人力巡…

vite配置@别名,以及如何让IDE智能提示路经

1.配置路径(vite.config.js) // vite.config.js import { defineConfig } from "vite"; import vue from "vitejs/plugin-vue"; import path from "path";// https://vite.dev/config/ export default defineConfig({server: {port: 8080,},plu…

【Linux】LInux下第一个程序:进度条

前言&#xff1a; 在前面的文章中我们学习了LInux的基础指令 【Linux】初见&#xff0c;基础指令-CSDN博客【Linux】初见&#xff0c;基础指令&#xff08;续&#xff09;-CSDN博客 学习了vim编辑器【Linux】vim编辑器_linux vim insert-CSDN博客 学习了gcc/g【Linux】编译器gc…

RPA+AI:自动化办公机器人开发指南

RPAAI&#xff1a;自动化办公机器人开发指南 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 RPAAI&#xff1a;自动化办公机器人开发指南摘要引言技术融合路径1. 传感器层&#xff1a;多模态数据接入2. 决策层&…

计算矩阵A和B的乘积

根据矩阵乘法规则&#xff0c;编程计算矩阵的乘积。函数fix_prod_ele()是基本方法编写&#xff0c;函数fix_prod_opt()是优化方法编写。 程序代码 #define N 3 #define M 4 typedef int fix_matrix1[N][M]; typedef int fix_matrix2[M][N]; int fix_prod_ele(f…

Houdini POP入门学习05 - 物理属性

接下来随着教程学习碰撞部分&#xff0c;当粒子较为复杂或者下载了一些粒子模板进行修改时&#xff0c;会遇到一些较奇怪问题&#xff0c;如粒子穿透等&#xff0c;这些问题实际上可以通过调节参数解决。 hip资源文件&#xff1a;https://download.csdn.net/download/grayrail…