Что "const" предотвращает?
От: TheAteist  
Дата: 21.12.09 10:04
Оценка:
На что "const" влияет в функциях 1-6, т.е что "const" предотвращает в этих функциях ?
Спасибо.
class HealthClub
{
private:
    Trainer* m_trainers[10];
    Device** m_devices;
public:
//(1)
    const Device* GetDevice(const char* Name) const;
//(2)
    Device* const GetDevice(const char* Name) const;
//(3)
    const Device* const GetDevice(const char* Name) const;
//(4)
    Device** const GetAllDevices() const;
//(5)
    Trainer* const*  GetAllTrainers() const;
//(6)
    Trainer** const  GetAllTrainers() const;
}
Re: Что "const" предотвращает?
От: rg45 СССР  
Дата: 21.12.09 10:37
Оценка:
Здравствуйте, TheAteist, Вы писали:

TA>На что "const" влияет в функциях 1-6, т.е что "const" предотвращает в этих функциях ?

TA>Спасибо.
TA>
TA>class HealthClub
TA>{
TA>private:
TA>    Trainer* m_trainers[10];
TA>    Device** m_devices;
TA>public:
TA>//(1)
TA>    const Device* GetDevice(const char* Name) const;
TA>//(2)
TA>    Device* const GetDevice(const char* Name) const;
TA>//(3)
TA>    const Device* const GetDevice(const char* Name) const;
TA>//(4)
TA>    Device** const GetAllDevices() const;
TA>//(5)
TA>    Trainer* const*  GetAllTrainers() const;
TA>//(6)
TA>    Trainer** const  GetAllTrainers() const;
TA>}
TA>


Как я понимаю, в центре внимания здесь типы результатов функций, поэтому смотрим только на них.
В функциях 2, 4 и 6 модификатор const не предотвращает ничего. И ничего не меняет, если конечно речь не идет о более сложных сценариях использования, где имеют значение сигнатуры самих функций.

Типы результатов других функций:

(1) Указатель на константные данные. const запрещает изменение данных, адресуемых указателем.

(3) Константный указатель на константные данные. Второй const, ближний к имени функции, как бы запрешает изменять значение самого указателя. Но применительно к результату функции, мы итак не можем его изменить, независимо от этого модификатора. Поэтому, также как и в случаях 2, 4 и 6, этот модификатор не вводит никаких дополнительных ограничений и является избыточным. Его можно отбросить, после чего получим вариант №1.

(5) Здесь двойная косвенность. Указатель на константный указатель на неконстантные данные. Модификатор const препятствует изменению значения переменной-указателя, адресуемого другим "наружным" указателем. Сами данные, адресуемые через двойную косвенность, можно изменять.
--
Справедливость выше закона. А человечность выше справедливости.
Re: Что "const" предотвращает?
От: Кодт Россия  
Дата: 21.12.09 11:39
Оценка: 3 (1) +1 :))) :))) :))) :))) :))) :))
Здравствуйте, TheAteist, Вы писали:

TA>На что "const" влияет в функциях 1-6, т.е что "const" предотвращает в этих функциях ?

TA>
TA>class HealthClub
TA>{
TA>private:
TA>    Trainer* m_trainers[10];
TA>    Device** m_devices;
TA>public:
TA>//(1)
TA>    поклянитесь_не_трогать_объект_Device Device* GetDevice(const char* Name) клянусь_не_трогать_this_HealthClub;
TA>//(2)
TA>    Device* перебдел_накладывая_константность_на_значение_примитивного_типа GetDevice(const char* Name) клянусь_не_трогать_this_HealthClub;
TA>//(3)
TA>    поклянитесь_не_трогать_объект_Device Device* const GetDevice(const char* Name) клянусь_не_трогать_this_HealthClub;
TA>//(4)
TA>    Device** перебдел_накладывая_константность_на_значение_примитивного_типа GetAllDevices() клянусь_не_трогать_this_HealthClub;
TA>//(5)
TA>    Trainer* поклянитесь_не_писать_в_массив_указателей_Trainer *  GetAllTrainers() клянусь_не_трогать_this_HealthClub;
TA>//(6)
TA>    Trainer** перебдел_накладывая_константность_на_значение_примитивного_типа GetAllTrainers() клянусь_не_трогать_this_HealthClub;
TA>}
TA>


Вот примерно так
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re: Что "const" предотвращает?
От: Basil2 Россия https://starostin.msk.ru
Дата: 21.12.09 11:54
Оценка: 1 (1) +1
Здравствуйте, TheAteist, Вы писали:

TA>На что "const" влияет в функциях 1-6, т.е что "const" предотвращает в этих функциях ?


Добавлю что есть простое правило:

Const слева от "*" означает неизменность содержимого, const справа — неизменность указателя.


const char* p;
char const* p;
char const *p; // - строку нельзя изменять

char* const p; // - нельзя поменять саму переменную p
Проект Ребенок8020 — пошаговый гайд как сделать, вырастить и воспитать ребенка.
Re[2]: Что "const" предотвращает?
От: TheAteist  
Дата: 21.12.09 19:41
Оценка:
Здравствуйте, Basil2, Вы писали:

B>Здравствуйте, TheAteist, Вы писали:


TA>>На что "const" влияет в функциях 1-6, т.е что "const" предотвращает в этих функциях ?


B>Добавлю что есть простое правило:


B>Const слева от "*" означает неизменность содержимого, const справа — неизменность указателя.



B>
B>const char* p;
B>char const* p;
B>char const *p; // - строку нельзя изменять
Так зачем же придумали 3 вида с тем же смыслом?

B>char* const p; // - нельзя поменять саму переменную p
B>
Re: Что "const" предотвращает?
От: elw00d Россия http://elwood.su
Дата: 21.12.09 19:43
Оценка: +1
Здравствуйте, TheAteist, Вы писали:

TA>На что "const" влияет в функциях 1-6, т.е что "const" предотвращает в этих функциях ?

TA>Спасибо.

Странно, что вопрос константности так часто возникает на форумах.
Всем, кому хочется разобраться в этом вопросе раз и навсегда, советую открыть блог Алены С++ и врубить поиск по "const".
Там несколько постов, которые очень емко и точно описывают, что такое const и с чем его едят.
Re[3]: Что "const" предотвращает?
От: rg45 СССР  
Дата: 21.12.09 20:01
Оценка: :)))
Здравствуйте, TheAteist, Вы писали:

B>>Добавлю что есть простое правило:

B>>Const слева от "*" означает неизменность содержимого, const справа — неизменность указателя.

B>>
B>>const char* p;
B>>char const* p;
B>>char const *p; // - строку нельзя изменять
B>>


TA>Так зачем же придумали 3 вида с тем же смыслом?


Ты видишь разницу между вторым и третьим? Тогда я еще и четвертый вид могу подкинуть:
char const * p;
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: Что "const" предотвращает?
От: Кодт Россия  
Дата: 22.12.09 08:38
Оценка: +2 :)))
Здравствуйте, elw00d, Вы писали:

E>Странно, что вопрос константности так часто возникает на форумах.

E>Всем, кому хочется разобраться в этом вопросе раз и навсегда, советую открыть блог Алены С++ и врубить поиск по "const".
E>Там несколько постов, которые очень емко и точно описывают, что такое const и с чем его едят.

Э, дорогой! Я специально переманивал читателей Алёны на RSDN, а ты затеял переманивать обратно?

Ну а что касается про "очень ёмко" и "раз и навсегда" — тут не соглашусь. С++ таит в себе такую мощь и бездну, что "несколькими постами" не ограничишься. Берём, например, список дефектов стандарта — и удивляемся
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[4]: Что "const" предотвращает?
От: pvirk Россия  
Дата: 22.12.09 08:59
Оценка: :)
Здравствуйте, rg45, Вы писали:

B>>>Добавлю что есть простое правило:

B>>>Const слева от "*" означает неизменность содержимого, const справа — неизменность указателя.

B>>>
B>>>const char* p;
B>>>char const* p;
B>>>char const *p; // - строку нельзя изменять
B>>>


TA>>Так зачем же придумали 3 вида с тем же смыслом?


R>Ты видишь разницу между вторым и третьим? Тогда я еще и четвертый вид могу подкинуть:

R>
R>char const * p;
R>


Не, ну это не серьёзно, надо так:
char const* /*строку нельзя изменять*/ p;

Re[3]: Что "const" предотвращает?
От: Николай Ивченков  
Дата: 22.12.09 09:04
Оценка:
Кодт:

E>>Странно, что вопрос константности так часто возникает на форумах.

E>>Всем, кому хочется разобраться в этом вопросе раз и навсегда, советую открыть блог Алены С++ и врубить поиск по "const".
E>>Там несколько постов, которые очень емко и точно описывают, что такое const и с чем его едят.

К>Э, дорогой! Я специально переманивал читателей Алёны на RSDN, а ты затеял переманивать обратно?


К>Ну а что касается про "очень ёмко" и "раз и навсегда" — тут не соглашусь. С++ таит в себе такую мощь и бездну, что "несколькими постами" не ограничишься. Берём, например, список дефектов стандарта — и удивляемся


+1. Вместо того, чтобы изучать C++ по чьим-то там блогам, лучше почитать книги классиков и стандарт.
Re[4]: Что "const" предотвращает?
От: elw00d Россия http://elwood.su
Дата: 22.12.09 16:39
Оценка:
Здравствуйте, Николай Ивченков, Вы писали:

НИ>Кодт:


К>>Э, дорогой! Я специально переманивал читателей Алёны на RSDN, а ты затеял переманивать обратно?




К>>Ну а что касается про "очень ёмко" и "раз и навсегда" — тут не соглашусь. С++ таит в себе такую мощь и бездну, что "несколькими постами" не ограничишься. Берём, например, список дефектов стандарта — и удивляемся


НИ>+1. Вместо того, чтобы изучать C++ по чьим-то там блогам, лучше почитать книги классиков и стандарт.


Блоги тоже полезны Во всяком случае, основы там все есть. Прекрасное дополнение к книгам классиков А стандарт читать имхо занятие чересчур сложное для тех, кто еще не разобрался с простыми вещами.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.