C++ const 对类成员函数的限定


今天在刷题的时候,遇到这样一个报错:


Line 4: Char 49: error: static member function cannot have 'const' qualifier
    4 |     static bool cmp(const PII& a, const PII& b) const {
      |                                                 ^~~~~
1 error generated.

这个错误表明在第 4 行的静态成员函数中使用了 const 限定符,而静态成员函数不能有 const 限定符。

静态成员函数是属于类而不是类的实例的,所以无 this 指针。因此,它们没有访问实例的权限,也就没有实例上的状态可供修改。因此,将const限定符应用于静态成员函数是不合法的,因为它们本身就不会修改任何实例的状态。

要解决这个问题,我们可以将静态成员函数的声明和定义中的const关键字去掉,使其成为非常量函数。例如:


static bool cmp(const PII& a, const PII& b) {
    // ...
}

这样就解决了这个错误。

总结:在静态成员函数中不能使用 const 限定符,因为静态函数根本没有 this 指针,不可能修改成员变量,一定对类来说是无副作用的。这一点在学习 Java 的时候已经分析的很透彻了。在学习 C++ 面向对象编程的时候要学会融汇贯通。在 Java 中,没有相应的关键字,但可以通过注释进行提醒。例如使用 JML 中的 pure 关键字:


public class Example {
    private int value;

    //@ ensures \result == value;
    //@ pure
    public int getValue() {
        return value;
    }

    //@ requires x > 0;
    //@ ensures \result == x * x;
    //@ pure
    public int square(int x) {
        return x * x;
    }
}

Author: Yixiang Zhang
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Yixiang Zhang !
评论
  TOC