const после метода класса, который после названия функции пишется?
Перед функцией const квалифицирует тип возвращающегося значения. После - условный *this, к которому метод применяется. Edit: struct S { void const_m ( ) const { } void non_const_m ( ) { } }; /* ... */ S s1; s1.const_m(); /* error */ s1.non_const_m(); /* ok */ S const s2; s2.const_m(); /* ok */ s2.non_const_m(); /* ok */
даже в случае наподобие const T& get() const? =)
в примере ошибка же, наоборот!
Даже в общем случае есть разница: квалификаторы игнорируются только для встроенных типов.
извините, а что означает "Перед функцией const квалифицирует тип возвращающегося значения"? Типо возвращает значение, которое что?
> если метод не помечен как const, то его нельзя вызывать на неконстантном объекте. константном* 1:1
я просто не понимаю, что значит "ОТНОСИТСЯ к возвращаемому типу"
то есть, подчеркну еще раз ( и сделаем шаг назад от методов вообще, к переменным-ссылкам) string a = «hello world»; const string& b = a; … b.clear(); // ошибка, b не имеет прав на запись в строку string& c = a; // ссылка на неконстантную строку имеет права на запись, поэтому c.clear(); // ok все три переменные, a,b и c, по сути работают с одной и той же строкой, но переменная a имеет к ней полный доступ, на чтение и запись (ну и вообще владеет объектом, но речь сейчас не об этом), b - может только смотреть, но не изменять, c тоже может изменять строку как угодно, но не управляет временем ее жизни. Компилятор различает типы этих переменных, a - это собственно строка, а b - ссылка на константную строку, c - ссылка на неконстантную строку. Ссылка - это по сути тот же указатель, поэтому правила типов с ней не отличаются от правил работы с указателями: const string* c = &b; string const* d = &b; // абсолютно то же самое, что c, имя типа и const можно менять местами, но нельзя смещать относительно * и &
Короче. Вот мой код: class test { private: int MaxPlayers = 10; public: const int& constGetMaxPlayers() { return MaxPlayers; }; }; int main() { test a; const int& b = a.constGetMaxPlayers(); // OK } Константная функция, которая здесь является геттером, выводит данные о максимальном количестве игроков. В мэйне, я создаю ссылку на константный int, и теперь моя переменная b является переменной "ТОЛЬКО ДЛЯ ЧТЕНИЯ". Но если я вдруг вместо константной ссылки сделаю так: class test { private: int MaxPlayers = 10; public: const int& constGetMaxPlayers() { return MaxPlayers; }; }; int main() { test a; int& b = a.constGetMaxPlayers(); // NO } То, компилятор будет ругаться. Ибо я пытаюсь сделать из "неприкосаемой" ссылки на инт, прикасаемую, которую в дальнейшем можно будет изменить, изменив и саму переменную MaxPlayers. Вот для чего нужен const в начале функции (ну такой пример если брать). ДЯ???
Он к типу относится
на самом деле конкретно в данном случае const int& не обязателен, проще и правильнее возвращать по значению. зато const крайне рекомендован справа от функции, чтобы метод можно было вызывать на константном объекте.
Все не правильно, думать заново блын придется походу
кажется, ты просто малость запутался ( если любая функция (в том числе метод - частный случай функции) возвращает объект по ссылке на константный объект - то присвоить ее результат можно только тоже константной ссылке: const int& b = a.constGetMaxPlayers(); // можно int& b = a.constGetMaxPlayers(); // нельзя
другими словами, const рядом с типом - это ограничение на тип. const справа от метода нужен для того, чтобы разрешить методу вызываться для const объекта. таким образом, если у нас есть класс struct Foo { int getSomeValue() const; const Bar& getBar() const; void setBar(Bar bar); }; то «const Foo» - это такой как бы самостоятельный тип, «как Foo, только без неконстантных методов» - то есть если у Foo доступны все три метода, то у const Foo - только первые два, помеченные как const.
На самом деле, переменные типа const T заводят не очень часто (это реально константа, которую нельзя менять с момента своего создания), зато на практике чаще всего как раз используются константые ссылки и указатели. то есть чаще всего бывает вот так: ` void PrintString(const std::string& text) // эта функция примет любую, хоть константную, хоть неконстантную, строку, потому что она собирается работать только с константными методами строки. { std::cout << text; } … std::string text = «Hello»; text += «World»; PrintString(text); ``
Да вроде даже примерно правильно, только пока не можете чётко выразить свои мысли :)
То есть то, что я выше написал, с двумя вариантами кода - правильно?
Насколько я уловил мысль, общая суть верна
если так уж грубо говорить, то конст перед функцией лучше всего использовать с ссылками или указателями. константные методы гарантировано не меняют обьект. как в моем примере, я попытался показать, что конст метод не дает изменить переменную, создав не константную ссылку на нее. я просто не все еще слова знаю и говорю "от себя")
Обсуждают сегодня