c++ 类的常量成员函数

在 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++ 代码的重要实践之一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值