Вопрос по const, c++, member-functions – спецификатор типа const вскоре после имени функции [дубликат]

10

На этот вопрос уже есть ответ здесь:

Значение 'const' последний в объявлении функции класса? 7 ответов

В C ++ иногда я вижу объявления, как показано ниже:

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

Что делает в этом случае точный спецификатор типа const?

Ваш Ответ

3   ответа
4

Это означает, что он не изменяет объект, поэтому вы можете вызывать этот метод с помощью объекта const.

то есть

class MyClass {
public:
   int ConvertToInteger() const;

};

Означает, что если у вас есть

const MyClass myClass;

ты можешь позвонить

int cValue = myClass.ConvertToInteger();

без ошибки компиляции, потому что объявление метода указывает, что оно не изменяет данные объекта.

15

Спецификатор 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
8

$ 9.3.1 / 3 штатов-

«Нестатическая функция-член может быть объявлена ​​как const, volatile или const volatile. Эти cvqualifiers влияют на тип указателя this (9.3.2). Они также влияют на тип функции (8.3.5) функции-члена; функция-член объявленная const - это функция-член const, функция-член, объявленная volatile - это функция-член volatile, а функция-член, объявленная const volatile - функция-член const volatile. "

Итак, вот резюме:

a) Спецификатор const может использоваться только для классов, не являющихся статическими функциями-членами

б) квалификация 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)
}

Похожие вопросы