const修饰函数时,哪些值不可以被改变

本文解释了C++中const修饰成员函数的含义,强调其不能修改对象的非静态数据成员,包括直接或间接修改、调用非const方法以及通过指针。还讨论了常量引用作为参数时的不同行为。

🚚
在 C++ 中,将成员函数修饰为 const 有一个含义:该函数不能修改对象的非静态数据成员。当一个成员函数被声明为 const 时,它承诺不会对对象进行任何修改操作。
具体来说,以下内容受到 const 成员函数的限制:

  1. 非静态数据成员:在 const 成员函数中,不能直接或间接地修改对象的任何非静态数据成员。这包括通过赋值、调用非 const 成员方法等方式。
  2. 调用其他非 const 成员方法:由于 const 成员函数保证不修改对象状态,因此它们只能调用其他被声明为 const 的成员方法。无法调用没有被声明为 const 的非 const 方法。
  3. 修改指针类型的内容:如果一个指针是类中的 non-const 数据成员,并且该指针指向某个内存区域,则在 const 成员函数中不能通过该指针来更改其所指向内存位置上的值。

需要注意的是,在使用常量引用作为参数传递给普通(non-const)成员方法时,默认情况下编译器会自动选择匹配最佳候选项(即根据是否存在合适版本)。但如果使用常量引用作为参数传递给了常量(const)成员方法,则只能调用该类中被声明为 const 的成员方法。

当将一个成员函数修饰为 const,以下是一些具体的例子说明哪些值不能被改变:
非静态数据成员的修改:

class MyClass {
public:
    int value;

    void nonConstMethod() {
        value = 10; // 可以修改非 const 成员函数中的非静态数据成员
    }

    void constMethod() const {
        // value = 20; // 错误!不能在 const 成员函数中修改非静态数据成员
        int newValue = 20;
        // this->value = newValue; // 错误!也无法通过 this 指针来修改值
    }
};

调用其他非 const 成员方法:

class MyClass {
public:
    void nonConstMethod() {}

    void constMethod() const {
        // nonConstMethod(); // 错误!无法调用其他非常量(non-const)成员方法
        anotherConstMethod(); // 正确!可以调用已经声明为常量(const)的其他成员方法 
     }

     void anotherConstMethod() const {}
};

修改指针类型内容:

class MyClass {
public:
   int* ptr;

   MyClass(int val) : ptr(new int(val)) {}

   ~MyClass() { delete ptr; }

   void modifyValue(int newVal) {
       *ptr = newVal;
   }

   void printValue() const { 
      std::cout << "Value: " << *ptr << std::endl;
      //*ptr = 100;  //!错误, 在const成语函敿内不允许修改指针所指向的内存位置上的值
   }
};

在 printValue() 这个 const 成员函数中,我们可以读取 ptr 指针所指向的值,但是不能修改它。

C++中,`const`修饰函数的作用主要体现在**类的成员函数**上。当一个成员函数被声明为`const`,它表示该函数修改类的任何成员变量(除非变量是`mutable`的)。这种机制增强了程序的安全性和可读性,并且允许在常量对象上调用这些函数。 ### 作用 1. **保证成员变量修改** `const`成员函数承诺会更改对象的状态。编译器会强制检查这一点,如果在`const`函数中尝试修改非`mutable`成员变量,将导致编译错误[^2]。 2. **允许常量对象调用函数** 如果一个对象被声明为`const`,则只能调用那些也被声明为`const`的成员函数。否则,编译器会报错。 3. **重载决策中的用途** `const`成员函数可以与非`const`版本形成重载,从而根据调用对象是否为`const`来决定调用哪一个函数。这在实现访问器(getter)函数非常有用。 4. **提高代码可读性与安全性** 明确标识哪些函数改变对象状态,有助于其他开发者理解代码意图,并避免意外修改对象内容。 --- ### 使用方法 #### 函数声明与定义 在类内部声明`const`成员函数,需要在函数参数列表后的关键字`const`进行标注: ```cpp class MyClass { public: int getValue() const; // 声明为 const 成员函数 private: int value; }; ``` 在类外部定义,也必须重复`const`关键字: ```cpp int MyClass::getValue() const { return value; // 正确:只读访问 // value = 10; // 错误:不能修改成员变量 } ``` #### 调用方式 对于常量对象或通过常量指针/引用访问的对象,只能调用`const`成员函数: ```cpp const MyClass obj; obj.getValue(); // 合法:getValue 是 const 函数 // obj.modifyValue(); // 非法:modifyValue const 函数 ``` #### 与返回`const`的区别 - `const`修饰函数本身(即成员函数后加`const`)用于限制函数对成员变量的访问。 - `const`出现在返回部分(如`const int ff()`),则用于表明返回的是一个常量,调用者不能通过返回修改原始数据[^2]。 例如: ```cpp const int getValue() const; // 返回const int,同函数本身也是 const ``` #### 指针类型返回的`const` 如果函数返回的是指针类型,并且希望防止调用者通过该指针修改数据,则应使用`const`限定返回类型: ```cpp const char* getStr() const; // 返回的字符串内容可被修改 ``` 此调用者必须使用`const char*`接收结果,以确保安全性: ```cpp const char* str = obj.getStr(); // 正确 // char* str = obj.getStr(); // 错误 ``` --- ### 示例代码 ```cpp #include <iostream> class Counter { public: Counter(int val) : count(val) {} int getCount() const { return count; } // const 成员函数 void setCount(int val) { count = val; } // 非 const 成员函数 private: int count; }; int main() { const Counter c(10); std::cout << "Count: " << c.getCount() << std::endl; // 合法 // c.setCount(20); // 非法:不能const 对象上调用非 const 函数 return 0; } ``` --- ### 总结 `const`修饰函数C++中一种重要的语言特性,它仅提升了代码的安全性和可维护性,也为编译器提供了优化的机会。合理使用`const`成员函数能够帮助开发者编写更清晰、更健壮的面向对象程序。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值