当前位置: 首页 > 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

相关文章:

  • 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 游戏艺术、动画和光照
  • b2c电子商务模式的三大类型/seo是指什么
  • 嘉兴模板建站代理/品牌广告
  • 如何用dreamweaver做网站/seo外包服务方案
  • 文明网站建设方案/怎样搭建网站
  • 专做化妆品的网站/深圳网络推广网站推广
  • 163网易免费邮箱登录/长沙网站seo排名