Const перед параметром vs const после имени функции С++
В чем разница между чем-то подобным
friend Circle copy(const Circle &);
и что-то вроде этого
friend Circle copy(Circle&) const;
Я знаю const после того, как функция используется, чтобы сообщить компилятору, что эта функция не будет пытаться изменить объект, на который он вызван, а что другой?
Ответы
Ответ 1
Первая форма означает, что объект (состояние) Circle
, привязанный к ссылке, которая является параметром функции copy()
, не может быть изменен с помощью copy()
через эту ссылку. Ссылка является ссылкой на const
, поэтому невозможно будет вызвать функции-члены из Circle
через эту ссылку, которые сами по себе не определены как const
.
Вторая форма, с другой стороны, является незаконной: только функции-члены могут быть const
-qualified (в то время как вы заявляете, что существует глобальная функция friend
).
Когда const
квалифицирует функции-члены, квалификация относится к неявному аргументу this
. Другими словами, этой функции не будет разрешено изменять состояние объекта, на который он вызывается (объект, на который указывает неявный указатель this
), за исключением объектов mutable
, но эта другая история.
Сказать с кодом:
struct X
{
void foo() const // <== The implicit "this" pointer is const-qualified!
{
_x = 42; // ERROR! The "this" pointer is implicitly const
_y = 42; // OK (_y is mutable)
}
void bar(X& obj) const // <== The implicit "this" pointer is const-qualified!
{
obj._x = 42; // OK! obj is a reference to non-const
_x = 42; // ERROR! The "this" pointer is implicitly const
}
void bar(X const& obj) // <== The implicit "this" pointer is NOT const-qualified!
{
obj._x = 42; // ERROR! obj is a reference to const
obj._y = 42; // OK! obj is a reference to const, but _y is mutable
_x = 42; // OK! The "this" pointer is implicitly non-const
}
int _x;
mutable int _y;
};
Ответ 2
Методы класса С++ имеют неявный параметр this
, который предшествует всем явным. Таким образом, функция объявлена внутри класса следующим образом:
class C {
void f(int x);
Вы можете представить, действительно выглядит так:
void f(C* this, int x);
Теперь, если вы заявите об этом следующим образом:
void f(int x) const;
Как будто вы написали это:
void f(const C* this, int x);
То есть конечный const
делает параметр this
const, что означает, что вы можете вызвать метод для объектов const типа класса и что метод не может изменить объект, на который он был вызван (по крайней мере, а не через обычные каналы).
Ответ 3
Circle copy(Circle&) const;
сам выполняет функцию const
. Это можно использовать только для функций-членов класса/структуры.
Создание функции-члена const
означает, что
- он не может вызывать неконстантные функции-члены
- он не может изменить какие-либо переменные-члены.
- он может вызываться объектом const (объекты
const
могут вызывать только функции const
). Неконстантные объекты также могут вызывать функцию const
.
Эта функция должна быть членом класса Circle.
Теперь рассмотрим следующее:
Circle copy(const Circle &);
а это означает, что передаваемый параметр не может быть изменен внутри функции. Этот может быть или не быть функцией-членом класса.
ПРИМЕЧАНИЕ: Можно перегрузить функцию таким образом, чтобы иметь const
и неконстантную версию одной и той же функции.
Ответ 4
Один параметр относится к параметру другой функции.
Circle copy(const Circle &);
Это означает, что переданный параметр не может быть изменен внутри функции
Circle copy(Circle&) const;
Функция -определенная функция const
используется для функций-членов и означает, что вы не можете изменять элементы данных самого объекта. Пример, который вы отправили, был бессмысленным.
Справа налево
Если мы перепишем первую функцию как Circle copy(Circle const&);
, что означает одно и то же, становится ясно, что чтение справа налево становится полезным. copy
- это функция, которая берет const
ссылку на объект Circle
и возвращает объект Circle
по ссылке.
Ответ 5
friend Circle copy(const Circle &);
//относится к постоянному параметру функции. can not "изменить значение, сохраненное параметром.
Необходимо удалить друга в вашем примере
Круговая копия (Circle &) const;
// не может изменить это значение poniter, называемое константной функцией члена
Ответ 6
friend Circle copy(const Circle &);
Значение параметра не будет изменено во время вызова функции.
friend Circle copy(const Circle &)const ;
Функция является средством доступа, которое не меняет значения членов класса. Как правило, существуют типы функций: аксессоры и мутаторы. Аксессор: проверяет, но не изменяет состояние своего объекта.