函数名称后不久的const类型限定符

这个问题在这里已经有了答案:

  • C ++方法声明中最后一个“const”的含义? 7个答案

  • $ 9.3.1 / 3个州 -

    “一个非静态成员函数可能被声明为const,volatile或const volatile,这些cvqualifiers影响这个指针的类型(9.3.2),它们也影响成员函数的函数类型(8.3.5);一个成员函数声明的const是一个const成员函数,一个声明为volatile的成员函数是一个volatile成员函数,而一个声明为const volatile的成员函数是一个const volatile成员函数。“

    所以这里是总结:

    a)const限定符只能用于类非静态成员函数

    b)功能的cv资格参与超载

    struct X{
       int x;
       void f() const{
          cout << typeid(this).name();
          // this->x = 2;  // error
       }
       void f(){
          cout << typeid(this).name();
          this->x = 2;    // ok
       }
    };
    
    int main(){
       X x;
       x.f();         // Calls non const version as const qualification is required
                      // to match parameter to argument for the const version
    
       X const xc;
       xc.f();        // Calls const version as this is an exact match (identity 
                      // conversion)
    }
    

    成员函数声明结尾的const限定符指示可以在本身为const的对象上调用该函数。 const成员函数承诺不更改任何不可变数据成员的状态。

    当然,const成员函数也可以在非const对象上调用(并且仍然作出相同的承诺)。

    成员函数也可以在常量上重载。 例如:

    class A {
      public:
        A(int val) : mValue(val) {}
    
        int value() const { return mValue; }
        void value(int newVal) { mValue = newVal; }
    
      private:
        int mValue;
    };
    
    A obj1(1);
    const A obj2(2);
    
    obj1.value(3);  // okay
    obj2.value(3);  // Forbidden--can't call non-const function on const object
    obj1.value(obj2.value());  // Calls non-const on obj1 after calling const on obj2
    

    这意味着它不会修改对象,因此您可以使用const对象调用该方法。

    class MyClass {
    public:
       int ConvertToInteger() const;
    
    };
    

    意味着如果你有

    const MyClass myClass;
    

    你可以打电话

    int cValue = myClass.ConvertToInteger();
    

    没有编译错误,因为方法声明表明它不会更改对象的数据。

    链接地址: http://www.djcxy.com/p/40417.html

    上一篇: const type qualifier soon after the function name

    下一篇: What does const mean following a function/method signature?