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

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

Войти
Регистрация
Восстановить пароль
 
wowka19
1 / 1 / 0
Регистрация: 12.10.2011
Сообщений: 22
#1

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

12.10.2011, 18:11. Просмотров 338. Ответов 9
Метки нет (Все метки)

Учусь по учебнику Джесс Либерти и наткнулся на некоторые непонятки.
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++):

Некоторые вопросы - Pascal ABC
Всем привет ! Я недавно начал изучать Паскаль, и у меня возникло несколько вопросов, которые я бы хотел прояснить. И так, вопрос :) : 1....

Некоторые вопросы по flowLayoutPanel - C#
Можно ли добавить в flowLayoutPanel 3 рядом стоящие компонента по горизонтали но при этом чтобы свойство FlowDirection = TopDown? ...

Некоторые вопросы по железу - Компьютерное железо
Привет всем на форуме, являюсь новичком по железу - читаю статьи и книжки в интернете по PC. возникают вопросы. буду благодарен если...

Некоторые вопросы по синтаксису - Delphi
Будьте так добры, пожалуйста. Помогите чуток)). Я сам сишник, а тут мне тест по учебе дали на паскаль. многое сделал уже. Но во многом еще...

Некоторые вопросы по проге - Visual Basic
В теме 3 дня, поэтому прошу сильно не пинать. Был конечно школьный опыт в qb и tp на xt-шках, но было давно... Посмотрите код, есть пара...

Некоторые вопросы по ucoz'у - HTML, CSS
Хотелось бы вот эту форму заполнения сделать по центру. Изначально она была растянута и была очень длинной, но через html я ее сжал. Теперь...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 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
440 / 203 / 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" константой не является.
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2011, 16:37
Привет! Вот еще темы с ответами:

Некоторые вопросы по переходникам видеокарты - Мониторы
Возможно подключить через hdmi на dvi и dvi на vga? Замено hdmi на vga.

ASUS G55v некоторые вопросы - Ноутбуки
новый g55vw, звук из колонок кажется не очень хорошего качества, и иногда если в наушниках сидишь звук переходит на колонки, приходится...

Некоторые вопросы о правильном написании кода - C (СИ)
Просьба не стебаться, прогеров знакомых, как ни странно (таких чтобы мог бы спросить каждый день такие мелочи) нет, учусь сам по книжке...

Жить флешке или не жить? - Flash-память
Флешка в магнитоле стоит всегда. Вчера заглушила машину и ушла по делам, когда вернулась магнитола перестала видеть флешку и настойчиво...


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

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

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