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

条款03:尽可能使用 const

const 允许我们指定一个语义约束,使某个值应该保持不变

1、const 修饰 变量,指针,函数,函数返回值等,可以使程序减少错误,或者更容易检测错误:

        指针常量:int* const p;//指针地址不可变,指针指向值可变

        常量指针:const int* p;//指针指向值不可变,指针地址可变

        常量指针常量:const int* const p;//都不可变

const 修饰迭代器:

        iterator 相当于 T* const //指针常量

        const_iterator 相当于 const T* //常量指针

const 修饰函数返回值:

const int max(int a, int b)
{
    a > b ? a : b;
}
 
int c = 6;
max(a,b) = c;
//将 c 的值赋给 max(a, b) 是没有意义的,const 防止这种操作的发生

2、const 修饰成员函数

        如果两个成员函数只是常量性不同(其他相同)则可以发生重载

                const 类对象调用 const 成员函数

                non-const 类对象调用普通成员函数

bitwise:

        const 成员函数不能改变(除 static)成员变量的值,因为常函数里 this 指针指向的值不可改变。同理,const 对象不可以调用 non-const 函数,因为函数有能力更改成员属性的值。

        但是若成员变量是一个指针,仅仅改变指针指向的值却不改变指针地址(地址是 this 指向的值),则不算是 const 函数 ,但能够通过 bitwise 测试。

        使用 mutable 可以消除 non-static 成员变量的 bitwise constness 约束。

class person
{
public:
    
    person(int a)
    {
        m_id = a;
    }
    
    int& func() const
    {
        m_id = 888;
    }
    
    mutable int m_id;
}; 
 
int main()
{
    const person p(666);
    p.func();
    
    cout << p.m_id << endl;
    
    system("pause");
    return 0;
}


3、当 const 和 non-const 成员函数有实质的等价实现时,利用两次转型,令 non-const 调用 const 可以避免代码重复。

const char& operator[](int pos) const
{
    //...
    //...
    return name[pos];
}
 
char& operator[](int pos)
{
    return
        const_cast<char&>//移除第一次转型添加的 const
            (
                static_cast<const classname>(*this)[pos]
                //把 classname 类型数据转换为 const classname
                //使得能够调用 const operator[]
            );
}

                   
原文链接:https://blog.csdn.net/qq_62674741/article/details/124896986

http://www.dtcms.com/a/15642.html

相关文章:

  • JVM——垃圾回收器
  • AI与前端安全:效率提升与安全保障并行
  • 开源的 DeepSeek-R1「GitHub 热点速览」
  • 硬件学习笔记--43 电磁兼容试验-7 浪涌试验介绍
  • UE求职Demo开发日志#31 完成全部流程和梳理优化任务
  • LLM - 理解 DeepSeek 的 GPRO (分组相对策略优化) 公式与源码 教程(2)
  • 2025.2.10——1400
  • stm32电机驱动模块
  • python 基础知识100问
  • 第一章嵌入式系统概论考点02嵌入式系统的组成
  • ASP.NET Core 如何使用 C# 向端点发出 POST 请求
  • HTTP相关面试题
  • 利用MATLAB的linkaxes函数实现子图频率轴同步缩放
  • DateConverter does not support default String to ‘Date‘ conversion.
  • HARCT 2025 分论坛9:专用设备和机器人系统
  • WebGL 导入 OBJ 文件全解析
  • jenkins-获取当前时间戳
  • 买卖股票的最佳时机II(力扣122)
  • Python使用Flask结合DeepSeek开发
  • 2D 游戏艺术、动画和光照
  • Vue 2 — 配置请求转发
  • 【第5章:深度生成模型— 5.4 深度生成模型前沿全景:从Diffusion到多模态,揭秘AI生成技术的未来】
  • $ npx electron-forge import 一直报权限问题 resource busy or locked,
  • EasyRTC嵌入式WebRTC视频通话SDK支持Web浏览器、Linux、ARM、Android、iOS
  • win10右键使用IDEA打开
  • 日志2025.2.14
  • 深入浅出 Python Logging:从基础到进阶日志管理
  • Vue笔记(九)
  • ADC入门准备(九):信号与系统知识回顾
  • JVM学习