170 похожих чатов

Ребята, обьясните пожалуйста для чего нужен const перед функцией и

const после метода класса, который после названия функции пишется?

19 ответов

26 просмотров

Перед функцией 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? =)

Anton Semenov
даже в случае наподобие const T& get() const? =)

Даже в общем случае есть разница: квалификаторы игнорируются только для встроенных типов.

Алексей-Комягин Автор вопроса

извините, а что означает "Перед функцией 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 можно менять местами, но нельзя смещать относительно * и &

Алексей-Комягин Автор вопроса
Anton Semenov
то есть, подчеркну еще раз ( и сделаем шаг назад о...

Короче. Вот мой код: 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 в начале функции (ну такой пример если брать). ДЯ???

Алексей Комягин
Короче. Вот мой код: class test { private: int...

на самом деле конкретно в данном случае const int& не обязателен, проще и правильнее возвращать по значению. зато const крайне рекомендован справа от функции, чтобы метод можно было вызывать на константном объекте.

Алексей-Комягин Автор вопроса
Anton Semenov
на самом деле конкретно в данном случае const int&...

Все не правильно, думать заново блын придется походу

Алексей Комягин
Все не правильно, думать заново блын придется похо...

кажется, ты просто малость запутался ( если любая функция (в том числе метод - частный случай функции) возвращает объект по ссылке на константный объект - то присвоить ее результат можно только тоже константной ссылке: 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); ``

Алексей Комягин
Все не правильно, думать заново блын придется похо...

Да вроде даже примерно правильно, только пока не можете чётко выразить свои мысли :)

Алексей-Комягин Автор вопроса

То есть то, что я выше написал, с двумя вариантами кода - правильно?

Алексей-Комягин Автор вопроса
Ofee Oficsu
Насколько я уловил мысль, общая суть верна

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

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

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта