const type qualifier soon after the function name [duplicate]

江枫思渺然 提交于 2020-01-01 08:34:07

问题


In C++ sometimes I see declarations like below:

return_type function_name(  datatype parameter1, datatype parameter2  ) const
{ /*................*/}

What does this const type qualifier exact do in this case?


回答1:


$9.3.1/3 states-

"A nonstatic member function may be declared const, volatile, or const volatile. These cvqualifiers affect the type of the this pointer (9.3.2). They also affect the function type (8.3.5) of the member function; a member function declared const is a const member function, a member function declared volatile is a volatile member function and a member function declared const volatile is a const volatile member function."

So here is the summary:

a) A const qualifier can be used only for class non static member functions

b) cv qualification for function participate in overloading

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)
}



回答2:


The const qualifier at the end of a member function declaration indicates that the function can be called on objects which are themselves const. const member functions promise not to change the state of any non-mutable data members.

const member functions can also, of course, be called on non-const objects (and still make the same promise).

Member functions can be overloaded on const-ness as well. For example:

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



回答3:


It means that it doesn't modify the object, so you can call that method with a const object.

i.e.

class MyClass {
public:
   int ConvertToInteger() const;

};

Means that if you have

const MyClass myClass;

you can call

int cValue = myClass.ConvertToInteger();

without a compile error, because the method declaration indicates it doesn't change the object's data.



来源:https://stackoverflow.com/questions/3474119/const-type-qualifier-soon-after-the-function-name

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!