константа перед параметром по сравнению с константой после C++ имени функции

Каково различие между чем-то вроде этого

friend Circle copy(const Circle &);

и что-то вроде этого

friend Circle copy(Circle&) const;

Я знаю константу после того, как функция используется, чтобы сказать компилятору, что эта функция не попытается изменить объект, к этому обращаются, что относительно другого?

62
задан 14 April 2013 в 16:34

6 ответов

Первая форма означает, что (состояние) Circle объект, связанный со ссылкой, которая является параметром эти copy(), функция не будет изменена copy() через ту ссылку. Ссылка является ссылкой на const, таким образом, не будет возможно вызвать функции членства Circle через ту ссылку, которые самостоятельно не квалифицированы как const.

вторая форма, с другой стороны, недопустима: только [1 117] функции членства могут быть const - квалифицированы (в то время как, что Вы объявляете, существует глобальное, friend функция).

, Когда const квалифицирует функции членства, квалификация относится к неявному this аргумент. Другими словами, той функции не позволят изменить состояние объекта, это вызывается на (объект, на который указывают неявным this указатель) - за исключением [1 112] объекты, но это - другая история.

Для высказывания этого с кодом:

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;
};
159
ответ дан 31 October 2019 в 13:08

Методы класса 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 константа параметра, означая, что можно вызвать метод на объекты константы типа класса, и что метод не может изменить объект, на который это было вызвано (по крайней мере, не по нормальным каналам).

51
ответ дан 31 October 2019 в 13:08
Circle copy(Circle&) const;

делает функцию const саму. Это может только использоваться для функций членства класса/структуры.

Создание функции членства const означает, что

  • не может назвать функции членства неконстанты
  • , оно не может заменить членские переменные.
  • это может назвать объект константы (const, объекты могут только звонить const функции). Объекты неконстанты могут также звонить const функция.

Этот должен быть функцией членства класса' Круг '.

Теперь рассматривают следующий:

Circle copy(const Circle &);

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

ПРИМЕЧАНИЕ: возможно перегрузить функцию таким способом иметь const и версия неконстанты той же функции.

6
ответ дан 31 October 2019 в 13:08

Каждый обращается к параметру другому к функции.

Circle copy(const Circle &);

Это означает, что параметр передал в, не может быть изменен в функции

Circle copy(Circle&) const;

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

Read справа налево

, Если мы переписываем первую функцию как Circle copy(Circle const&);, что означает то же самое, становится ясно, что чтение справа налево становится полезным. copy функция, которая берет const ссылка на Circle объект и возвращается Circle объект ссылкой.

3
ответ дан 31 October 2019 в 13:08

friend Circle copy(const Circle &);//относится к постоянному параметру функции. наклон' изменение значение сохранен параметром.

Потребность удалить друга в Вашем примере Круговая копия (Circle&) константа; //не может изменить это значение poniter, названное как функция членства

Constant
0
ответ дан 31 October 2019 в 13:08
friend Circle copy(const Circle &);

значение параметра не будет изменено во время вызовов функции.

friend Circle copy(const Circle &)const ; 

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

-1
ответ дан 31 October 2019 в 13:08

Другие вопросы по тегам:

Похожие вопросы: