с ++ смысл использования const в подписи - PullRequest
3 голосов
/ 06 января 2010

Пожалуйста, помогите мне понять следующую подпись:

err_type funcName(const Type& buffer) const;

Итак, для первого const это означает, что содержимое Type не может измениться или что ссылка не может измениться?

во-вторых, что означает второе const? У меня даже намека нет.

Спасибо заранее, JBU

Ответы [ 7 ]

18 голосов
/ 06 января 2010

Второй const означает, что метод может быть вызван для объекта const.

Рассмотрим этот пример:

class foo
{
public:
    void const_method() const;
    void nonconst_method();
};

void doit()
{
    const foo f;

    f.const_method();      // this is okay
    f.nonconst_method();   // the compiler will not allow this
}

Кроме того, метод const не позволяет изменять какие-либо элементы объекта (если только член не помечен как изменяемый):

class foo
{
public:
    void const_method() const;

private:
    int r;
    mutable int m;
};

void foo::const_method() const
{
    m = 0; // this is okay as m is marked mutable
    r = 0; // the compiler will not allow this
}
5 голосов
/ 06 января 2010

Да, первый const означает, что buffer не может измениться.

Второй const подразумевает, что это функция-член класса, и не будет изменять объект (this).

4 голосов
/ 06 января 2010

Это объяснит лучше, чем большинство из нас, вероятно, может, поэтому я не буду повторять: http://www.parashift.com/c++-faq-lite/const-correctness.html

3 голосов
/ 06 января 2010

Непосредственно: означает, что const применяется к экземплярам, ​​для которых вызывается этот метод. Вы не можете вызывать его для неконстантного объекта.

Правило const: Ключевое слово const изменяет предмет на left , если только нет ничего, в этом случае он изменяет предмет вправо.

Таким образом, тип "const int" является особым случаем и означает то же самое, что и "int const".

Когда вы применяете правило к методам, вы получаете " const". (Это что-то вроде натяжения, но все же полезно понять этот путь.)

Другие примеры («чтение изнутри»), где «id» является идентификатором, но может быть удалено без изменения типов:

  • int const* id & emsp; = указатель на константу int
  • int* const id & emsp; = постоянный указатель на int
  • int const id[5] & emsp; = массив из 5x констант int
  • int (*const id)[5] & emsp; = постоянный указатель на массив 5x int

Чаще всего T const& и T const* используются некоторыми людьми, так как он поддерживает последовательность, не требуя особого случая. Я также предпочитаю это, потому что тип в начале часто более полезен, чем знание, что это константа.

2 голосов
/ 06 января 2010

Другие ответы верны, но они имеют более существенное значение. Это контракт для вашего класса, который гласит: «Вызывая эту функцию, вы не будете изменять состояние вашего объекта». Люди интерпретируют это по-разному, некоторые рассматривают его как объект, который не изменится по внешнему виду для вызывающей стороны, в то время как другие рассматривают его как объект вообще не изменится, если вы вызовете эту функцию.

0 голосов
/ 06 января 2010

Хотя вы получили несколько хороших ответов, я думаю, стоит указать, что класс может содержать mutable переменных-членов. Элемент mutable - это элемент, который вы всегда можете изменять, даже если он является частью объекта const. Обычно они используются для таких вещей, как запоминание и кэширование, где переменная может быть изменена без влияния на видимое пользователем состояние объекта в целом.

0 голосов
/ 06 января 2010

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

Второй const имеет смысл только при использовании в качестве метода для класса. Гарантируется, что вызов метода не будет иметь побочных эффектов для класса, который содержит метод. По сути, гарантия того, что этот метод можно безопасно вызывать на const объектах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...