Каково различие между функцией членства константы и функцией членства неконстанты?

Я очень смущен версией константы и функцией членства версии неконстанты как ниже:

value_type& top() { return this.item }
const value_type& top() const { return this.item }

Каково различие между этими двумя функциями? В какой ситуации они использовались бы?

14
задан fredoverflow 18 June 2010 в 05:24
поделиться

4 ответа

Короче говоря, они используются для добавления "const-корректности" в вашу программу.

value_type& top() { return this.item }

Это используется для предоставления изменяемого доступа к item. Он используется для того, чтобы вы могли изменять элемент в контейнере.

Например:

c.top().set_property(5);  // OK - sets a property of 'item'
cout << c.top().get_property();  // OK - gets a property of 'item'

Одним из распространенных примеров для этого паттерна является возврат мутабельного доступа к элементу с помощью vector::operator[int index].

std::vector<int> v(5);
v[0] = 1;  // Returns operator[] returns int&.

С другой стороны:

const value_type& top() const { return this.item }

Это используется для предоставления const доступа к item. Это более строгий вариант, чем предыдущий, но у него есть одно преимущество - вы можете вызывать его на const-объекте.

void Foo(const Container &c) {
   c.top();  // Since 'c' is const, you cannot modify it... so the const top is called.
   c.top().set_property(5);  // compile error can't modify const 'item'.
   c.top().get_property();   // OK, const access on 'item'. 
}

В продолжение примера с вектором:

const std::vector<int> v(5, 2);
v[0] = 5;  // compile error, can't mutate a const vector.
std::cout << v[1];  // OK, const access to the vector.
16
ответ дан 1 December 2019 в 10:18
поделиться

Функция-член с квалификацией const будет вызываться, если функция-член вызывается для объекта с квалификацией const.

Функция-член, не квалифицированная константой, будет вызываться, если функция-член вызывается для объекта, не квалифицированного константой.

Например:

MyStack s;
s.top(); // calls non-const member function

const MyStack t;
t.top(); // calls const member function

Обратите внимание, что те же правила применяются при вызове функции-члена по ссылке на объект или через указатель на объект: если указатель или ссылка на константный объект, константная функция-член будет называться; в противном случае будет вызвана неконстантная функция-член.

6
ответ дан 1 December 2019 в 10:18
поделиться

Если у вас есть

class Foo
{
    value_type& top() { return this.item }
    const value_type& top() const { return this.item }
}

Если у вас есть

Foo foo;
const Foo cfoo;

Типы возврата при вызове top() следующие:

value_type& bar = foo.top();
const value_type& cbar = cfoo.top();

Другими словами - если у вас есть константный экземпляр вашего класса, то в качестве перегрузки для вызова выбирается const-версия функции.

Причина этого (в данном конкретном случае) в том, что вы можете передавать ссылки на члены (например, item в данном случае) из const экземпляра класса, и гарантировать, что они тоже const - таким образом, не изменяемые и сохраняющие const-ность экземпляра, из которого они пришли.

4
ответ дан 1 December 2019 в 10:18
поделиться

Когда функция-член объявлена ​​как const , происходит то, что неявный параметр указателя this , переданный в функцию, набирается как указатель на const объект. Это позволяет вызывать функцию с использованием экземпляра константного объекта.

value_type& top();    // this function cannot be called using a `const` object
const value_type& top() const; // this function can be called on a `const` object
0
ответ дан 1 December 2019 в 10:18
поделиться
Другие вопросы по тегам:

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