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

C++

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

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

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

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

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

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

Не могу понять как работает этот код в деталях C++
C++ Константный указатель на целое
Константный указатель C++
Что значит константный указатель на объект, указатель на константный объект, и как это можно использовать? C++
константный метод и указатель this C++
C++ Не могу понять, как правильно передать указатель на объект в файл
C++ Можно ли утверждать, что в C++ имя функции - константный указатель на функцию ?
Константный метод и константный аргумент в методе C++
C++ Константный указатель на константные данные (указатели)
Как понять указатель константы? C++
Константный указатель на константу меняет значение C++
Константная переменная и константный указатель C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
2443 / 1648 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
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; // нельзя ++ и менять значение
OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
02.01.2010, 23:39  [ТС]     Как понять этот константный указатель? #3
>> alex_x_x

Спасибо за разъяснение. А то запутался с этими const. Уже решил пару выкинуть.
Evg
Эксперт CАвтор FAQ
17289 / 5537 / 345
Регистрация: 30.03.2009
Сообщений: 15,078
Записей в блоге: 26
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, а делают только по специальным опциям
Evg
Эксперт CАвтор FAQ
17289 / 5537 / 345
Регистрация: 30.03.2009
Сообщений: 15,078
Записей в блоге: 26
19.08.2013, 11:00     Как понять этот константный указатель? #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Для истории. Всю эту галиматью про const утащил в блог
http://www.cyberforum.ru/blogs/18334/blog87.html
Yandex
Объявления
19.08.2013, 11:00     Как понять этот константный указатель?
Ответ Создать тему
Опции темы

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