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

Некоторые немешающие жить но терзающие мозг вопросы - C++

Восстановить пароль Регистрация
 
wowka19
1 / 1 / 0
Регистрация: 12.10.2011
Сообщений: 22
12.10.2011, 18:11     Некоторые немешающие жить но терзающие мозг вопросы #1
Учусь по учебнику Джесс Либерти и наткнулся на некоторые непонятки.
1. (примерно так)
C++
1
2
3
const Cat * const Function(const Cat * const p) {
    return p;
}
Здесь меня смущает второе слово const. Имхо оно не имеет никакого смысла, в то время как наличие остальных влияет (может влиять) на программу.

2.
C++
1
2
3
4
5
6
7
8
9
10
Cat * Family = new Cat[500];
int i;
Cat * pCat;
for (i = 0; i < 500; i++)
{
    pCat = new Cat;
    pCat->SetAge(2*i + 1);
    Family[i] = *pCat;
    delete pCat;
}
Я не могу понять, зачем нужен дополнительный указатель pCat и зачем создавать временную область памяти под объект Cat, производить с некоторые операции, а потом присваивать его к эл-ту массива.
Ведь, насколько я понимаю, в строке

C++
1
Cat * Family = new Cat[500];
уже происходить помимо резервирования памяти и ИНИЦИАЛИЗАЦИЯ эл-ов массива экземплярами Cat и как и следует тому с выполнением стандартных конструкторов.
Имхо код ниже будет разумней:

C++
1
2
3
4
Cat * Family = new Cat[500];
int i;
for (i = 0; i < 500; i++)
    Family[i].SetAge(2*i + 1);
Пожалуйста, развейте сомнения по этим вопросам...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2011, 18:11     Некоторые немешающие жить но терзающие мозг вопросы
Посмотрите здесь:

C++ Вопросы
Мозг взрывается C++
C++ Вопросы по C++
Вопросы по С++ C++
Вопросы по C++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
12.10.2011, 18:15     Некоторые немешающие жить но терзающие мозг вопросы #2
1. Читай Неочевидные ответы на простые вопросы п.4

2. Да, все верно.
wowka19
1 / 1 / 0
Регистрация: 12.10.2011
Сообщений: 22
12.10.2011, 18:16  [ТС]     Некоторые немешающие жить но терзающие мозг вопросы #3
не понял, можно пояснить пожалйста
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
12.10.2011, 18:34     Некоторые немешающие жить но терзающие мозг вопросы #4
wowka19, по поводу второго вопроса: никто не говорит, что ты будешь так писать в реальных программах. Пример просто демонстрирует работу с членами класса через указатель

по поводу первого вопроса смотри ссылку выше, пункт 4.5 (краткие итоги). там увидишь, что в зависимости от того, где написано слово const конструкция приобретает разный смысл
wowka19
1 / 1 / 0
Регистрация: 12.10.2011
Сообщений: 22
13.10.2011, 15:09  [ТС]     Некоторые немешающие жить но терзающие мозг вопросы #5
2aeshes, ну я же сказал, что понимаю на что влияет положение const. вопрос в другом: Какой смысл во ВТОРОМ const?
Извините, но по 1-му моему вопросу в п.4 "Неочевидных вопросов..." ничего нету. Можете объяснить?

Причем после прочтения пункта 4 про 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;
по поводу второго блока кометов:
А что здесь некорректного? мы же y'ку присваиваем значение, на которое указывает указатель c, а не наоборот. Да и если бы даже наоборот:
*c = y;
проблем бы тоже не было, ведь константным (в результате "const int *c;") является значение в памяти по адресу 'c', НО в результате "c = &d;" значение указателя изменилось на адрес переменной 'd', которая ввиду объявления "int d" константой не является.

Хотел бы узнать мнение других людей по этому вопросу (а также по Первому пункту моего первого поста). Заранее Спасибо!
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
13.10.2011, 15:20     Некоторые немешающие жить но терзающие мозг вопросы #6
Цитата Сообщение от wowka19 Посмотреть сообщение
2aeshes, ну я же сказал, что понимаю на что влияет положение const. вопрос в другом: Какой смысл во ВТОРОМ const?
Извините, но по 1-му моему вопросу в п.4 "Неочевидных вопросов..." ничего нету. Можете объяснить?
Может быть константен сам указатель, а не то на что он указывает
т.е. его нельзя заставить указаывать на другую переменную:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
    int a = 1, b = 2;
 
    int * const cp = &a;
    int * p = &b;
 
    ++*cp;
    ++*p;
 
    p  = &a;
    cp = &b; /* error */
 
    return 0;
}
wowka19
1 / 1 / 0
Регистрация: 12.10.2011
Сообщений: 22
13.10.2011, 15:37  [ТС]     Некоторые немешающие жить но терзающие мозг вопросы #7
Уважаемый Net_Wanderer, в приведенном вами примере все верно и я полностью согласен с вами. Я еще раз повторю: я прекрасно понимаю что значит
C++
1
const int * p
,
а что
C++
1
int * const p
! НО,
если вы внимательно взгляните на приведенный мною пример, то увидите, что там есть ФУНКЦИЯ!
которая возвращает адрес на константный (первый const) Cat. Но что значит второй const?
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
13.10.2011, 15:46     Некоторые немешающие жить но терзающие мозг вопросы #8
Цитата Сообщение от wowka19 Посмотреть сообщение
Но что значит второй const?
Да, он бессмысленнен, потому что функция возвращает r-value , котоое и так не может быть модифицировано

Добавлено через 1 минуту
Цитата Сообщение от wowka19 Посмотреть сообщение
Я еще раз повторю: я прекрасно понимаю что значит
вы бы сразу сказали, что говорите про const в возвращаемом значении, а не в параметрах, тогда бы вас сразу все поняли
wowka19
1 / 1 / 0
Регистрация: 12.10.2011
Сообщений: 22
13.10.2011, 15:50  [ТС]     Некоторые немешающие жить но терзающие мозг вопросы #9
Ураааааааааааааааа! Ну наконец-то со мной разделили мою точку зрения, а то она мне покоя не давала. Все-таки Джесс Либерти...

Добавлено через 2 минуты
Net_Wanderer, я же сразу (первый пост) это и сказал что ВТОРОЙ const из 4х представленных

Добавлено через 1 минуту
Кстати, вот про это никто не отписался, а хотелось бы прояснить этот момент:
Цитата Сообщение от wowka19 Посмотреть сообщение
Причем после прочтения пункта 4 про CONST, появились сомнения по этой статье:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const int *c;
int d;
/* На такую конструкцию компилятор НЕ должен ругаться, т.к.
** с точки зрения поинтерных записей конструкция опасной не является,
** т.е. через указатель "c" мы не можем модифицировать
** значение переменной "d" */
c = &d;
...
int x = *c;
...
/* В этом месте код формально становится некорректным, т.к. компилятор
** в режиме с оптимизациями имеет право нижеидущий код "y=*c"
** заменить на "y=x", поскольку "c" должно указывать на неизменяемую
** память */
d++;
...
int y = *c;
по поводу второго блока кометов:
А что здесь некорректного? мы же y'ку присваиваем значение, на которое указывает указатель c, а не наоборот. Да и если бы даже наоборот:
*c = y;
проблем бы тоже не было, ведь константным (в результате "const int *c;") является значение в памяти по адресу 'c', НО в результате "c = &d;" значение указателя изменилось на адрес переменной 'd', которая ввиду объявления "int d" константой не является.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2011, 16:37     Некоторые немешающие жить но терзающие мозг вопросы
Еще ссылки по теме:

C++ Главная функция (вводит некоторые значения и передает их и ссылки на некоторые переменные в функцию)
крестики нолики, нужен мозг C++
Указатели взорвали мозг C++

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

Или воспользуйтесь поиском по форуму:
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
13.10.2011, 16:37     Некоторые немешающие жить но терзающие мозг вопросы #10
Цитата Сообщение от wowka19 Посмотреть сообщение
Кстати, вот про это никто не отписался, а хотелось бы прояснить этот момент:
C
1
2
3
4
5
6
7
8
9
10
11
12
const int *c;
int d = 0;
...
int x = *c;
...
/* В этом месте код формально становится некорректным, т.к. компилятор
 * в режиме с оптимизациями имеет право нижеидущий код "y=*c"
 * заменить на "y=x", поскольку "c" должно указывать на неизменяемую
 * память */
d++;
...
int y = *c;
Если компилятор сделает оптимизацию и заменит *c на x (на что const дает ему право), то y получит значение 0, а если без замены то 1
Yandex
Объявления
13.10.2011, 16:37     Некоторые немешающие жить но терзающие мозг вопросы
Ответ Создать тему
Опции темы

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