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

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 161, средняя оценка - 4.63
OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
#1

Как понять этот константный указатель? - C++

02.01.2010, 23:07. Просмотров 19735. Ответов 4
Метки нет (Все метки)

В общем, имеется класс Cat. Объект класса - SimpleCat. И имеется функция с константым указателем:

C++
1
const SimpleCat* const FunctionTwo(const SimpleCat* const theCat)
Что обозначают все эти const?
Насколько я понимаю:
1. Константный указатель.
2. Может ссылаться только на FunctionTwo
3. Ничего не изменяет в объекте.
4. Ничего не делает с объектом theCat.

Поправьте, где я ошибся...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2010, 23:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как понять этот константный указатель? (C++):

Большой константный массив - C++
Нужно хранить в классе большой константный массив (вектор). Модификатор const не обязателен (хотя было бы неплохо), имеется ввиду что...

Зачем нужен указатель на указатель при работе с однонаправленным списком? - C++
День добрый. Столкнулся с непониманием этой темы. В частности, совершенно непонятен алгоритм инициализации такого вот списка. Например:...

Если в класс нужно передать указатель на указатель на массив строк неизвестной длинны? - C++ Builder
Как проинициализировать массив строк wchar_t * (произвольного размера) , если его нужно передать в конструктор класса ? wchar_t *A1 =...

Как преобразовать этот класс из Delphi в c++ - C++ Builder
TKarta=class(TObject) private FDvig: boolean; Fi: integer; Fj: integer; FMast: string; FMesto: boolean; ...

Как понять синтаксис a=b|c; - C++ Builder
Сейчас разбираюсь в установках принтера и напоролся на такое присвоение значения: pdm->dmFields = pdm->dmFields | DM_PAPERSIZE; Если по...

Как передать указатель - Visual C++
Как передать указатель LPCWSTR на массив char?

4
alex_x_x
бжни
2451 / 1656 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
02.01.2010, 23:38 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
const SimpleCat* const
возвращает указатель, значение которого постоянно и содержимое, на которое он указывает менять нельзя
C++
1
const SimpleCat* const theCat
- принимает такой же указатель

этож определение/объявление функции как я понял?

Добавлено через 10 минут
вот для большего понимания:

C++
1
2
3
4
5
6
7
8
    int a = 100;
    const int* i = &a;
    //*i = 110; //ошибка
    ++i;        //можно
    int *const ii = &a;
    *ii = 10;
    //++ii;     //ошибка
    const int* const iii = &a; // нельзя ++ и менять значение
15
OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
02.01.2010, 23:39  [ТС] #3
>> alex_x_x

Спасибо за разъяснение. А то запутался с этими const. Уже решил пару выкинуть.
1
Evg
Эксперт CАвтор FAQ
18689 / 6654 / 468
Регистрация: 30.03.2009
Сообщений: 18,621
Записей в блоге: 29
03.01.2010, 13:47 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
OVERPOWER8, модификаторы всегда действуют на тип-указатель или переменную, которые написаны справа от модификатора. Это неформальное объяснение

C
1
int const a;
Справа от const находится переменная. Означает, что константной является переменная, т.е. в неё записывать нельзя. Однако формально с точки зрения языка мы имеем переменную "a" с типом "const int". Это означает, что для конструкции

C
1
int *b = &a;
компилятор выругается на неявное преобразование, поскольку переменная b имеет тип "указатель на int", а выражение "&a" имеет тип "указатель на const int". По умолчанию такое преобразование считается опасным, т.к. по языку через "b" можно будет сделать запись в "a". Поэтому компилятор пропустит такой код только с явным преобразованием

C
1
int *b = (int*) &a;
а после любого явного преобразования указателей компилятор снимает с себя всякую ответственность за неправильный код типа

C
1
2
3
4
5
6
7
8
const int a = 5;
int *b = (int*) &a;
...
/* Здесь мы изменили значение переменной a, которую описали с модификатором
 * const. В случае работы с оптимизациями компилятор может нижеидущий
 * код "x=a" заменить на "x=5", поскольку "a" описано как немодифицируемая переменная */
*b = 6;
int x = a;
Ну и следует упомянуть, что зачастую пишут

C
1
const int a;
что является эквивалентной записью, поскольку, как я уже говорил, неформально модификатор const действует ТОЛЬКО на типы-указатели и переменные. Т.е. const по сути действует на "a", поскольку "int" не является типом-указателем

---------------------------

C
1
int const *c;
или, как чаще пишут

C
1
const int *c;
В данном случае const действует на тип-указатель "int*". В итоге мы имеем переменную "c", которая имеет тип "const int*", что есть "указатель на const int". Конструкция означает, что мы имеем указатель, по которому нельзя ничего модифицировать и который указывает на немодифицируемую память

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

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const int *c;
int d;
 
/* На такую конструкцию компилятор НЕ должен ругаться, т.к.
 * с точки зрения поинтерных записей конструкция опасной не является,
 * т.е. через указатель "c" мы не можем модифицировать
 * значение переменной "d" */
c = &d;
...
int x = *c;
...
/* В этом месте код формально становится некорректным, т.к. компилятор
 * в режиме с оптимизациями имеет право нижеидущий код "y=*c"
 * заменить на "y=x", поскольку "c" должно указывать на неизменяемую
 * память */
d++;
...
int y = *c;
но на исполнении в теории может повести себя не так, как ожидалось (зависит от компилятора)

--------------------------------------

Вкратце можно сказать про два назначения модификатора const:

1. Уберечь от собственных ошибок на этапе компиляции. Понятно, что на этапе текстового разбора могут выявиться только ошибки, где идёт запись напрямую через переменную с модификатором const (или типа которой есть указатель на const).
2. Оптимизация кода компилятором. В реальной жизни оказалось так, что программисты слишком часто пишут неправильные коды (по типу того, что я указывал выше), поэтому большинство современных компиляторов по умолчанию НЕ делают никаких оптимизаций, связанных с модификатором const, а делают только по специальным опциям
21
Evg
Эксперт CАвтор FAQ
18689 / 6654 / 468
Регистрация: 30.03.2009
Сообщений: 18,621
Записей в блоге: 29
19.08.2013, 11:00 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Для истории. Всю эту галиматью про const утащил в блог
http://www.cyberforum.ru/blogs/18334/blog87.html
6
19.08.2013, 11:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2013, 11:00
Привет! Вот еще темы с ответами:

Что значит константный указатель на объект, указатель на константный объект, и как это можно использовать? - C++
Подскажите, что значит константный указатель на объект, указатель на константный объект, и как это можно использовать??

Как записать константный указатель на указатель - C (СИ)
Добрый вечер. Вот данная запись говорит. Указатель на константный указатель типа Int. int * const * a; как записать? ...

Константный указатель - C++
Почему в данном примере константный указатель может быть использован для вывода элементов вектора? #include <iostream> #include...

Константный указатель - C++
Здравствуйте! Имею класс - MyClass. Константный указатель на него: const MyClass *pMyClass; Но в программе я присваиваю далее...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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