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

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

02.01.2010, 23:07. Просмотров 19829. Ответов 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++):

Чем отличаются указатель на строку и константный указатель на строку?
Просто обьясните, как такое возможно? char *a="fff"; В чем отличие от этого?...

Большой константный массив
Нужно хранить в классе большой константный массив (вектор). Модификатор const...

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

Как предать указатель через LPARAM
Хочу обойтись без глобальных объектов в приложении на Win32Api, в приложении из...

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

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

4
alex_x_x
бжни
2454 / 1660 / 134
Регистрация: 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 / 2
Регистрация: 29.11.2009
Сообщений: 224
02.01.2010, 23:39  [ТС] #3
>> alex_x_x

Спасибо за разъяснение. А то запутался с этими const. Уже решил пару выкинуть.
1
Evg
Эксперт CАвтор FAQ
18940 / 6901 / 513
Регистрация: 30.03.2009
Сообщений: 19,445
Записей в блоге: 30
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
18940 / 6901 / 513
Регистрация: 30.03.2009
Сообщений: 19,445
Записей в блоге: 30
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
Привет! Вот еще темы с решениями:

Как понять синтаксис a=b|c;
Сейчас разбираюсь в установках принтера и напоролся на такое присвоение...

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

Как записать константный указатель на указатель
Добрый вечер. Вот данная запись говорит. Указатель на константный...

Константный указатель или указатель на константу?
Привет всем.Уважаемые программисты пожалуйста скажите чем отличать когда...


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

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

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