Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
pontakrin
1 / 1 / 0
Регистрация: 22.03.2010
Сообщений: 71
#1

Использование ключевого слова const - C++

22.03.2010, 16:17. Просмотров 1188. Ответов 16
Метки нет (Все метки)

как понимать такое:

C++
1
2
3
const int a; // понятно это константа с именем - а
int const a; // ? непонятно что это
const int const a; // ? тож не понятно чо эт такое
применение слова const в последних двух строках для меня загадка, хотя все три строки успешно проходят компиляцию
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.03.2010, 16:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Использование ключевого слова const (C++):

Ключевое слово const после ключевого слова new - C++
Наткнулся на такую запись const int* ciq = new const int (3); Какую роль играет const после new?

Работа ключевого слова extern - C++
Здравствуйте. Скажите пожалуйста, почему так с extern нельзя поступать? #include <iostream> int main() { extern...

int const * const foo(const int* param) const - разъясните значение квалификаторов - C++
int const * const foo(const int* param) const -----1------2----------3----------------4 1: ? 2: делает содержимое массива или...

Объяснить назначение ключевого слова static - C++
Здравствуйте! Я пытаюсь разобраться с использованием static`a и у меня такой вопрос: будет ли корректно работать программа...

Выделение памяти с использованием ключевого слова new и исключения - C++
Где-то читал, что наличие в коде throw, даже в том случае когда нет try/catch может приводить к некоторым замедлению потому что где-то...

Дайте характеристику применения ключевого слова enum - C++
Дайте характеристику применения ключевого слова enum. Какие приимущества такого применения по сравнению с исользованием символических...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
22.03.2010, 16:22 #2
Главное не путай вот это:
int *const p; /*указатель в котором значение меня нельзя: нельзя присваивать другие адреса,
требует инициализации при создании */
const int *p; /* указатель на константу, то есть этот указатель использует память для чтения.
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
22.03.2010, 16:23 #3
1-2 - одно и то же
а вместо третьего, полагаю, подразумевается:
C++
1
2
    int b=4;
    const int* const a=&b;//Константный указатель на константу
Т.е. нельзя ни изменить адрес, на который ссылается указатель, ни значение, которое хранится по этому адресу
1
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
22.03.2010, 16:28 #4
const int* const a=&b;//Константный указатель на константу
Так же предложу альтернативу: константному указателю на константу,
она проще в обращении:
Константная ссылка:
C++
1
2
int r = 20;
const int& p = r;  //константная ссылка на r
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
22.03.2010, 16:41 #5
Константой является то что стоит слева от ключевого слова const. Мне так проще было запомнить разницу в константных указателях xD
0
^Tecktonik_KiLLeR
1159 / 441 / 22
Регистрация: 23.06.2009
Сообщений: 6,242
Завершенные тесты: 1
22.03.2010, 18:33 #6
в данном случае нет разницы.
с указателями
C++
1
2
3
const int *a=0;//можно меня адрес что в указателя,но не ее значение
int const *b=0;//можно меня значение но не адрес
const int const *c=0;//не то не то
Добавлено через 31 секунду
если под рукой есть книга С++ за 21 день открой раздел указатели и читай...подробнейшим образом написано
0
pontakrin
1 / 1 / 0
Регистрация: 22.03.2010
Сообщений: 71
22.03.2010, 20:06  [ТС] #7
я не про употребление слова const с указателями спрашиваю, а про правила его употребления вообще, наверняка есть простое правило что относительно чего становится константным. например проканывает и такое:

C++
1
const int const func(){return 0;}
Цитата Сообщение от МедведЪ Посмотреть сообщение
в данном случае нет разницы.
с указателями
C++
1
2
3
const int *a=0;//можно меня адрес что в указателя,но не ее значение
int const *b=0;//можно меня значение но не адрес
const int const *c=0;//не то не то
Добавлено через 31 секунду
если под рукой есть книга С++ за 21 день открой раздел указатели и читай...подробнейшим образом написано
автор этой книги так увлекается словом const что некоторые его листинги не компилируются. кстати какя разница между переменной и указателем если это тоже обычная переменная но содержащая адрес (кстати в этой книге же написано). значит с указателем и переменной можно работать одинаково. ПРАВИЛО ДОЛЖНО БЫТЬ КАКОЕ ТО ток не знаю какое.
0
^Tecktonik_KiLLeR
1159 / 441 / 22
Регистрация: 23.06.2009
Сообщений: 6,242
Завершенные тесты: 1
22.03.2010, 20:10 #8
с помощью указателей можно работать с дин.памятью,с их помощью можно из ф-ии возвращать много значений.
Цитата Сообщение от pontakrin Посмотреть сообщение
автор этой книги так увлекается словом const что некоторые его листинги не компилируются
а в чем этого плохого...там правильно сказано,если пермененная не должна меняться то лучше для своего удобства писать конст,чтобы в гигантских кодах во время такой ошибки не стоило бы разбивать голову об стенку...и приведи пример который не коиплируется...и зы может это пиратская версия
0
pontakrin
1 / 1 / 0
Регистрация: 22.03.2010
Сообщений: 71
22.03.2010, 21:12  [ТС] #9
Цитата Сообщение от МедведЪ Посмотреть сообщение
с помощью указателей можно работать с дин.памятью,с их помощью можно из ф-ии возвращать много значений.

а в чем этого плохого...там правильно сказано,если пермененная не должна меняться то лучше для своего удобства писать конст,чтобы в гигантских кодах во время такой ошибки не стоило бы разбивать голову об стенку...и приведи пример который не коиплируется...и зы может это пиратская версия
попробуй скомпилировать листинг 16.2
0
^Tecktonik_KiLLeR
1159 / 441 / 22
Регистрация: 23.06.2009
Сообщений: 6,242
Завершенные тесты: 1
22.03.2010, 22:04 #10
у меня в послднем томе 13.4...выложи код,продолжении книги не у меня
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
22.03.2010, 22:58 #11
Цитата Сообщение от pontakrin Посмотреть сообщение
правила его употребления вообще, наверняка есть простое правило что относительно чего становится константным.
Перечитай сообщение под номером 5
0
pontakrin
1 / 1 / 0
Регистрация: 22.03.2010
Сообщений: 71
23.03.2010, 08:28  [ТС] #12
Цитата Сообщение от fasked Посмотреть сообщение
Константой является то что стоит слева от ключевого слова const. Мне так проще было запомнить разницу в константных указателях xD
объясни подробней, а то понять не могу. например у:

C++
1
const int a;
слева от слова const нет ничего, а константным стала сама переменная а. Может быть все таки справа?

Добавлено через 4 минуты
Цитата Сообщение от МедведЪ Посмотреть сообщение
у меня в послднем томе 13.4...выложи код,продолжении книги не у меня
тут файлы прикреплять нельзя а другими листингами (не по теме) топик наполнять, черное дело. просто поверь мне на слово и все. Я сюда не спорить пришел
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
23.03.2010, 10:04 #13
C++
1
const int a;
Этот случай не входит в правило написания const слева, вопрос о стиле программирования. Тоже самое можно написать, как
C++
1
int const a;
Теперь подробнее:
При использовании const с указателями, действие модификатора может распространяться либо на значение указателя, либо на данные на которые указывает указатель.
Работает (const относится к данным):
C++
1
2
const char * a = "a";
a="b";
Тоже самое и тоже работает:
C++
1
2
char const * a = "a";
a="b";
А вот это уже не работает:
C++
1
2
char * const a = "a";
a="b"; // <-- не работает
Если бы операция присвоения изменяла бы не указатель, а данные:
C++
1
*a = 'Y';
то ситуация была бы диаметрально противоположной...

То есть, когда пишешь const пиши его правее от того, что ты не хочешь изменять:
C++
1
2
3
4
int const a; // не хочу изменять значение, которое хранится в - int
int const * a; // не хочу изменять значение, то есть которое хранится в - int
int * const a; // не хочу изменять адрес, то есть указатель - *
int const * const a; // не хочу изменять ни адрес ни значение.
А вот строка, которую ты привел в примере, на gcc компиляцию не проходит и приводит к ошибке 'duplicate const'
Цитата Сообщение от pontakrin Посмотреть сообщение
const int const a;
1
pontakrin
1 / 1 / 0
Регистрация: 22.03.2010
Сообщений: 71
23.03.2010, 13:26  [ТС] #14
Цитата Сообщение от fasked Посмотреть сообщение
А вот строка, которую ты привел в примере, на gcc компиляцию не проходит и приводит к ошибке 'duplicate const'
зато работает на MS компиляторе

спасибо за помощь
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
23.03.2010, 13:32 #15
зато работает на MS компиляторе
MS Компилятор штука страшная, лучше держись близ стандарта ))..
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.03.2010, 13:32
Привет! Вот еще темы с ответами:

Найти первое вхождение в строку заданного ключевого слова - C++
1. Обеспечить ввод строки, затем определить ее длину, и определить в ней первое вхождение заданного ключевого слова, например, ‘from’,...

Каково практическое применение ключевого слова "protected" ? - C++
подскажите, пожалуйста, практическое применение ключевого слова &quot;protected:&quot;. Зачем его использовать, если &quot;добраться&quot; до privet членов в...

char operator[](unsigned short offset) const; // что означает const? - C++
Собстенно вопрос уже озвучен :).

Что это bool operator== (const CLASS&) const; - C++
Что это? class CLASS { public: bool operator== (const CLASS&amp;) const; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.03.2010, 13:32
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru