Какая разница между чем-то вроде этого
friend Circle copy(const Circle &);
и что-то вроде этого
friend Circle copy(Circle&) const;
Я знаю const после того, как функция используется, чтобы сообщить компилятору, что эта функция не будет пытаться изменить объект, для которого она вызывается, а как насчет другого?
Ответы:
Первая форма означает, что
Circle
объект (состояние), привязанный к ссылке, которая является параметромcopy()
функции, не будет измененcopy()
посредством этой ссылки. Ссылка является ссылкой наconst
, поэтомуCircle
через эту ссылку будет невозможно вызывать функции-члены , которые сами не квалифицируются какconst
.Вторая форма, с другой стороны, является незаконной: только функции-члены могут быть
const
квалифицированы (в то время как то, что вы объявляете, является глобальной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; };
источник
const
объектobj
классаX
, и я называю его «bar()
вроде»obj.bar(obj)
, что должно произойти и почему? Не должно произойтиobj._x = 42
сбоя, посколькуobj
это объявленоconst
в вызывающей программе?void bar(X const& obj) {...}
) выглядеть так?void bar(const X& obj) {...}
, переносconst
ключевого слова в это место меняет что-нибудь? Если да, не могли бы вы добавить и этот пример?const
применяется к тому, что находится слева, или к тому, что находится справа, если слева нет ничего. В вашем случае вы увидите, что для обеих версийconst
применяетсяX
.У методов класса C ++ есть неявный
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
параметр константным, что означает, что вы можете вызывать метод для константных объектов типа класса и что метод не может изменять объект, для которого он был вызван (по крайней мере, не через обычные каналы).источник
friend
часть, потому что я думаю, что она на самом деле не имеет отношения к реальному вопросу ОП (или к тому, чем станет настоящий вопрос, когда все проблемы обнаружатся). Быть по сему.Circle copy(Circle&) const;
делает
const
саму функцию . Это можно использовать только для функций-членов класса / структуры.Создание функции-члена
const
означает, чтоconst
объектом (const
объекты могут только вызыватьconst
функции). Неконстантные объекты также могут вызыватьconst
функцию.А теперь рассмотрим следующий:
Circle copy(const Circle &);
в то время как это означает, что переданный параметр не может быть изменен внутри функции. Это может быть или не быть функцией-членом класса.
ПРИМЕЧАНИЕ. Можно перегрузить функцию таким образом, чтобы у нее была
const
и неконстантная версия одной и той же функции.источник
Давайте устраним всю путаницу, связанную с
const
const
произошло от постоянного означает, что что-то не изменяемое, но читаемое.если мы уточним нашу переменную
const
ключевым словом, мы не сможем изменить ее позже.например, переменная const должна быть инициализирована при ее объявлении.
const
int var =25;
var =50; // gives error
если мы рассматриваем наш переменный указатель с после того, как мы не можем изменить сам указатель , но содержание указателя изменчиво . например // но
const
*
int *
const
ptr = new int;
ptr = new int; //gives error
*ptr=5445; //allowed
если мы квалифицируем нашу переменную-указатель с помощью before, мы можем изменить сам указатель, но содержимое указателя изменить нельзя . например // но
const
*
int
const
* ptr = new int(85);
//or
const
int * ptr = new int(85);
ptr = new int; // allowed
*ptr=5445; // gives error
указатель и содержимое как постоянные,
например
int
const
*
const
ptr = new int(85);
//or
const
int *
const
ptr = new int(85);
ptr = new int; // not allowed
*ptr=5445; // not allowed
Circle copy(const Circle &);
здесь const Circle означает, что значение Circle доступно только для чтения, если мы попытаемся изменить значение Circle внутри функции, это даст ошибку.
friend Circle copy(Circle&) const;
Этот тип функции не предназначен для переменных, не являющихся членами. Он используется для класса или структуры. Здесь вся функция квалифицируется ключевым словом const, что означает, что мы не можем изменить переменную-член объекта . например
class A{ public : int var; void fun1() { var = 50; // allowed } void fun2()const { var=50; //not allowed } };
источник
Один относится к параметру, другой - к функции.
Circle copy(const Circle &);
Это означает, что переданный параметр нельзя изменить в функции
Circle copy(Circle&) const;
const
Квалифицированный функция используется для функций - членов и средств вы не можете изменить элементы данных самого объекта. Пример, который вы опубликовали, был бессмысленным.Читать справа налево
Если мы перепишем первую функцию как
Circle copy(Circle const&);
, что означает то же самое, станет ясно, что чтение справа налево становится полезным.copy
- это функция, которая принимаетconst
ссылку наCircle
объект и возвращаетCircle
объект по ссылке.источник
friend Circle copy(const Circle &);
// относится к постоянному параметру функции. не могу изменить значение, хранящееся в параметре.Необходимо удалить друга в вашем примере. Копия круга (Круг &) const; // не можем изменить это значение понитера, названное постоянной функцией-членом
источник
friend Circle copy(const Circle &);
Значение параметра не будет изменено во время вызовов функции.
friend Circle copy(const Circle &)const ;
Функция является аксессором, который не изменяет никаких значений членов класса. В основном, есть типы функций: аксессоры и мутаторы. Аксессор: проверяет, но не изменяет состояние своего объекта.
источник