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 ; 

Функция является средством доступа, которое не меняет значения членов класса. Как правило, существуют типы функций: аксессоры и мутаторы. Аксессор: проверяет, но не изменяет состояние своего объекта.