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

c++ 类的常量成员函数

c++ 类的常量成员函数

      • `const` 成员函数的作用
      • 示例代码
      • 输出结果
      • 代码解析
      • `const` 成员函数的规则
      • 使用场景
      • 总结

在 C++ 中,类的成员函数末尾加上 const 关键字表示该函数是一个 常量成员函数。它的作用是告诉编译器:这个函数不会修改调用它的对象的状态(即不会修改对象的成员变量)。这种函数可以在 const 对象上调用,而非 const 成员函数则不能。


const 成员函数的作用

  1. 保证对象状态不被修改

    • const 成员函数不能修改对象的成员变量(除非成员变量被声明为 mutable)。
    • 如果尝试在 const 成员函数中修改成员变量,编译器会报错。
  2. 支持 const 对象调用

    • const 对象只能调用 const 成员函数。
    • const 成员函数不能在 const 对象上调用。
  3. 提高代码的可读性和安全性

    • 明确表示该函数不会修改对象的状态。
    • 避免意外修改对象的状态。
  4. 支持基于 const 的函数重载

    • 可以同时定义 const 和非 const 版本的成员函数,编译器会根据对象的常量性选择调用哪个版本。

示例代码

以下是一个简单的示例,展示了 const 成员函数的使用:

#include <iostream>
#include <string>

class MyClass {
private:
    std::string data;

public:
    MyClass(const std::string& str) : data(str) {}

    // 非 const 成员函数:可以修改对象的状态
    void setData(const std::string& str) {
        data = str;
    }

    // const 成员函数:不能修改对象的状态
    std::string getData() const {
        return data;
    }
};

int main() {
    MyClass obj1("Hello");
    const MyClass obj2("World");

    // 非 const 对象可以调用非 const 和 const 成员函数
    obj1.setData("Hello C++");
    std::cout << "obj1 data: " << obj1.getData() << std::endl;

    // const 对象只能调用 const 成员函数
    // obj2.setData("World C++"); // 错误:不能调用非 const 成员函数
    std::cout << "obj2 data: " << obj2.getData() << std::endl;

    return 0;
}

输出结果

obj1 data: Hello C++
obj2 data: World

代码解析

  1. setData 函数

    • 这是一个非 const 成员函数,可以修改对象的成员变量 data
    • 只能在非 const 对象上调用。
  2. getData 函数

    • 这是一个 const 成员函数,不能修改对象的成员变量。
    • 可以在 const 和非 const 对象上调用。
  3. const 对象 obj2

    • 由于 obj2const 对象,只能调用 const 成员函数(如 getData)。
    • 如果尝试调用非 const 成员函数(如 setData),编译器会报错。

const 成员函数的规则

  1. 不能修改成员变量

    • const 成员函数中,不能修改类的成员变量(除非成员变量被声明为 mutable)。
    • 例如:
      class MyClass {
      private:
          mutable int counter; // mutable 成员变量可以在 const 成员函数中修改
      public:
          void increment() const {
              counter++; // 允许修改 mutable 成员变量
          }
      };
      
  2. 不能调用非 const 成员函数

    • const 成员函数中,只能调用其他 const 成员函数。
    • 例如:
      class MyClass {
      public:
          void nonConstFunc() {
              // 非 const 成员函数
          }
          void constFunc() const {
              // nonConstFunc(); // 错误:不能调用非 const 成员函数
          }
      };
      
  3. 支持函数重载

    • 可以同时定义 const 和非 const 版本的成员函数,编译器会根据对象的常量性选择调用哪个版本。
    • 例如:
      class MyClass {
      public:
          void func() {
              std::cout << "Non-const func" << std::endl;
          }
          void func() const {
              std::cout << "Const func" << std::endl;
          }
      };
      

使用场景

  1. 只读操作

    • 对于不修改对象状态的函数(如 getter 函数),应该声明为 const
  2. const 对象

    • 当需要定义 const 对象时,必须提供 const 成员函数以供调用。
  3. 提高代码安全性

    • 明确函数的语义,避免意外修改对象状态。

总结

在类的成员函数末尾加上 const 关键字,表示该函数不会修改对象的状态。这种函数可以在 const 对象上调用,同时也可以提高代码的可读性和安全性。合理使用 const 成员函数是编写高质量 C++ 代码的重要实践之一。

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

相关文章:

  • 机器学习之强化学习
  • 更新Vim使其支持系统剪切板
  • 软件工程笔记下
  • 一种支持实时工具调用的大模型流式生成与协同方案
  • 【uniapp】图片添加canvas水印
  • (undone) MIT6.S081 Lec14 File systems 学习笔记
  • 本地部署项目记录【deepseek、QWQ】
  • 算法测试的2个重要指标详解
  • wordpress自定the_category的输出结构
  • 【C++】中的赋值初始化和直接初始化的区别
  • SSM架构 +java后台 实现rtsp流转hls流,在前端html上实现视频播放
  • 低代码开发直聘管理系统
  • Electron应用中获取设备唯一ID和系统信息
  • 【游戏】【客户端性能测试】
  • 【数据库系统概论】事务
  • vue 封装流动的线组件(支持实线, 虚线, 变色, 流动)
  • 企业AI数据安全白皮书:深寻模型会话保护与安当TDE实战
  • 初识CMDB:数据质量的管理
  • 责任链模式:优雅处理复杂流程的设计艺术
  • 扩展------项目中集成阿里云短信服务
  • Android Studio 一直 Loading devices
  • C++:面向对象编程(续)
  • DeepSeek DeepEP学习(二)normal notify dispatch
  • 【开源宝藏】Spring Trace 一种轻量级的日志追踪新方式
  • 第三次CCF-CSP认证(含C++源码)
  • Redis数据结构深度解析:从String到Stream的奇幻之旅(一)
  • Clion快捷键、修改字体
  • 深度学习系列78:使用langchain的api进行RAG
  • 介绍exadata中的smart Scan技术
  • Java在小米SU7 Ultra汽车中的技术赋能