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

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

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

19 ответов

25 просмотров

Перед функцией 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
Насколько я уловил мысль, общая суть верна

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

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

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

Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Товарищи, кто работа с iphelper? Или может я в самой логике ошибки фигачу, не пойму.... var ifTable : PMIB_IFTABLE; size, corSize: DWORD; Buffer ...
Warfarellen
4
я так понимаю, я так подозреваю, что создание такого плагина для человека, кто умеет писать плагины для делфи потребует минут 5-10 времени. но это мое подозрение. хотелось бы ...
Kraszx
7
Коллеги, добрый вечер. Создаю коллекцию от TFPGMap, ключ - перечисление, значение - целое. Нужно отсортировать коллекцию по значению. Как это можно сделать?
Kirill Filippenok
11
Скажи а ты когда этот канал создавал ты уже дельфи не любил, или это со временем пришло?
Роман Лях (rgreat)
18
Привет, такой вопросик появился кажется ли вам что Rust слишком сложный/строгий для высокоуровневого программирования и слишком "безопасный"/строгий для низкоуровневого?
Крокант
10
Всем привет! Использую кастомное модальное диалоговое окошко, все по классике - mrOK, mrCancel как ModalResult. Однако есть нюанс - в главной форме есть универсальный обработч...
Олег Гранишевский
20
Карта сайта