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

对于Const关键字修饰的对象

const T a; 声明的对象具有以下特点:
状态不可变(除非通过 mutable)。
只能调用 const 成员函数。
构造后不可修改,需通过构造函数初始化。
通过 const 指针 / 引用访问。

  1. 对象状态不可修改
    所有非静态成员变量(除非声明为 mutable)在对象构造后不可修改。

    class T {int value;mutable int count;  // 可变成员,可在const对象中修改
    public:void setValue(int v) { value = v; }  // 非const成员函数void incrementCount() const { count++; }  // const函数可修改mutable成员
    };const T a;  // 必须通过构造函数初始化
    // a.setValue(10);  // 错误:不能调用非const成员函数
    a.incrementCount();  // 允许:修改mutable成员
    
  2. 只能调用 const 成员函数
    const 对象只能调用 **const 成员函数 **,确保对象状态不被修改。

    class T {
    public:void f() const { /* 只读操作 */ }  // const成员函数void g() { /* 可修改操作 */ }       // 非const成员函数
    };const T a;
    a.f();  // 允许
    // a.g();  // 错误:const对象不能调用非const函数
    
  3. 构造与析构的特殊性
    构造函数:可在初始化时设置对象状态(因为对象尚未完全构造)。
    析构函数:隐式为 const,即使未显式声明(否则 const 对象无法正常析构)。

    class T {
    public:T(int v) : value(v) {}  // 构造函数可初始化const对象~T() { /* 析构函数隐式为const */ }
    private:int value;
    };const T a(10);  // 正确:通过构造函数初始化
    
  4. 成员函数重载与 const 版本
    类可提供 **const 和非 const 版本的同名函数 **,根据对象是否为 const 自动选择调用:

    class T {std::string data;
    public:const char& operator[](size_t pos) const {  // const版本(返回只读引用)return data[pos];}char& operator[](size_t pos) {  // 非const版本(返回可写引用)return data[pos];}
    };const T a;
    a[0] = 'x';  // 错误:调用const版本,返回const char&
    T b;
    b[0] = 'x';  // 允许:调用非const版本,返回char&
    
  5. 指针与引用的 const 限定
    const 对象只能被 const 指针 / 引用指向:

    const T a;
    T* ptr = &a;  // 错误:普通指针不能指向const对象
    const T* const_ptr = &a;  // 正确:const指针可指向const对象T& ref = a;  // 错误:普通引用不能绑定到const对象
    const T& const_ref = a;  // 正确:const引用可绑定
    
  6. 与标准库容器的交互
    存储 const 对象:标准库容器(如 std::vector)不能直接存储 const 对象(因容器需支持元素赋值和移动)。
    正确做法:存储普通对象,通过 const 引用访问。

    std::vector<T> vec;
    const T& const_ref = vec[0];  // 通过const引用访问容器元素
    
  7. 性能与优化
    编译器优化:const 对象可能被编译器视为常量,允许更多优化(如内联、常量传播)。
    内存布局:与普通对象相同,但访问权限受限制。

http://www.xdnf.cn/news/698401.html

相关文章:

  • 明远智睿SSD2351开发板:语音机器人领域的变革力量
  • 麻省理工新突破:家庭场景下机器人实现精准控制,real-to-sim-to-real学习助力
  • Conda更换镜像源教程:加速Python包下载
  • C++基础:模拟实现vector(有存在深层次的浅拷贝问题)
  • 【芯片设计- SoC 常用模块 9.1 -- PLL 介绍】
  • 本周白银想法
  • 《数据结构笔记六》队列 ⭐⭐⭐
  • Dolphin文档解析从理论到实践——保姆级教程
  • 【MySQL】第12节|MySQL 8.0 主从复制原理分析与实战(二)
  • VisionPro —— 上料检测模拟
  • AVL树
  • Kotlin扩展函数与属性实战指南:从入门到企业级应用
  • 【c++】【数据结构】红黑树
  • 【位运算】常见位运算总结
  • 云原生架构,各行业数字化转型法宝
  • 回归任务损失函数对比曲线
  • vue3+Pinia+element-plus 后台管理系统项目实战记录
  • 2..3...4.... Wonderful! Wonderful!_cf1930E分析与解答
  • SpringBoot 验证码练习
  • GRASS GIS 生成斜坡单元
  • Opengl纹理采样
  • 【C语言练习】069. 使用goto语句实现复杂的跳转
  • XCTF-web-mfw
  • socket编程预备
  • 基于DFT码本的波束方向图生成MATLAB实现
  • 【AUTOSAR OS 】保护功能解析:从原理到应用与源代码解析(上篇)
  • MySQL复杂查询与Union操作
  • SQLite数据库取证分析
  • 用 Python 构建跨平台前端界面:深入解读 Flet 库
  • windows本地虚拟机上运行docker-compose案例