当前位置: 首页 > 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 对象可能被编译器视为常量,允许更多优化(如内联、常量传播)。
    内存布局:与普通对象相同,但访问权限受限制。

相关文章:

  • CANdela/Diva系列9--CDD文件在CANoe工程的应用1
  • 精准监测,健康无忧--XC3576H工控主板赋能亚健康检测仪
  • Linux入门——入门常用基础指令(2)
  • 每日算法 -【Swift 算法】正则表达式匹配:支持 `.` 和 `*`
  • 端到端测试最佳实践:从入门到精通的完整指南
  • 【AUTOSAR OS 】保护功能解析:从原理到应用与源代码解析(上篇)
  • Docker 前端镜像容器部署指南
  • 【HW系列】—Log4j2、Fastjson、Shiro漏洞流量特征
  • 超声成像系统解决方案AFE模拟前端
  • Vue开发系列——Vue 生命周期钩子 及常见知识点
  • Cisco Meraki(MR36) 踩坑指南
  • 线程池学习(一)
  • 小白成长之路-Linux操作系统-进程管理
  • JVM——Truffle:语言实现框架
  • JVM与JMM深度解析:从Java 8到Java 21的演进
  • 字符串day8
  • Python 如何让自动驾驶的“眼睛”和“大脑”真正融合?——传感器数据融合的关键技术解析
  • 弧度 = 弧长与半径的比值
  • Linux系统之cal命令的基本使用
  • QT6 关于使用MSVC2019,UI设计师自定义控件的制作和QT Cretor里面调用
  • 做网站毕业论文/专业seo公司
  • 网站投入费用/外贸推广网站
  • 南京建设网站排名/百度手机端推广
  • 四川成都疫情/福州seo网络推广
  • 做垃圾桶的网站/整站优化要多少钱
  • 贵阳微信网站制作/网络营销的六大功能