Зачем использовать ключевое слово const до и после имени метода или функции?
В моем приложении есть следующий код. Почему мы используем ключевое слово const с типом возвращаемого значения и после имени метода?
const T& data() const { return data_; }
Ответ 1
const T& data() const { return data_; }
^^^^^
означает, что он вернет ссылку const на T (здесь data_)
Class c;
T& t = c.data() // Not allowed.
const T& tc = c.data() // OK.
const T& data() const { return data_; }
^^^^^
означает, что функция не будет изменять какие-либо переменные-члены класса (если только элемент не является mutable).
void Class::data() const {
this->data_ = ...; // is not allowed here since data() is const (unless 'data_' is mutable)
this->anything = ... // Not allowed unless the thing is 'mutable'
}
Ответ 2
Отборочный const (и volatile) привязывается к левой. Это означает, что в любое время, когда вы видите const, оно применяется к токену слева от него. Однако есть одно исключение; если ничего не осталось слева от const, вместо этого оно связывается справа. Важно запомнить эти правила.
В вашем примере первый const не имеет ничего слева от него, поэтому он привязывается к правилу, который равен T. Это означает, что возвращаемый тип является ссылкой на const T.
Вторая константа имеет что-то слева от нее; функция data(). Это означает, что const связывается с функцией, делая ее функцией const.
В конце мы имеем функцию const, возвращающую ссылку на const T.
Ответ 3
Первая const означает, что функция возвращает ссылку const T.
Второй говорит, что метод не меняет состояние объекта. То есть метод не изменяет никаких переменных-членов.
Ответ 4
const T& data() const { return data_; }
const после того, как функция-член указывает, что данные являются константной функцией-членом, и в этой функции-члене данные не изменяются.
const возвращает тип, возвращающий константу ref в T