Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 12.10.2011
Сообщений: 22

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

12.10.2011, 18:11. Показов 854. Ответов 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);
Пожалуйста, развейте сомнения по этим вопросам...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.10.2011, 18:11
Ответы с готовыми решениями:

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

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

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

9
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
12.10.2011, 18:15
1. Читай Неочевидные ответы на простые вопросы п.4

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

по поводу первого вопроса смотри ссылку выше, пункт 4.5 (краткие итоги). там увидишь, что в зависимости от того, где написано слово const конструкция приобретает разный смысл
0
1 / 1 / 0
Регистрация: 12.10.2011
Сообщений: 22
13.10.2011, 15:09  [ТС]
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" константой не является.

Хотел бы узнать мнение других людей по этому вопросу (а также по Первому пункту моего первого поста). Заранее Спасибо!
0
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
13.10.2011, 15:20
Цитата Сообщение от 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;
}
0
1 / 1 / 0
Регистрация: 12.10.2011
Сообщений: 22
13.10.2011, 15:37  [ТС]
Уважаемый Net_Wanderer, в приведенном вами примере все верно и я полностью согласен с вами. Я еще раз повторю: я прекрасно понимаю что значит
C++
1
const int * p
,
а что
C++
1
int * const p
! НО,
если вы внимательно взгляните на приведенный мною пример, то увидите, что там есть ФУНКЦИЯ!
которая возвращает адрес на константный (первый const) Cat. Но что значит второй const?
0
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
13.10.2011, 15:46
Цитата Сообщение от wowka19 Посмотреть сообщение
Но что значит второй const?
Да, он бессмысленнен, потому что функция возвращает r-value , котоое и так не может быть модифицировано

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

Добавлено через 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" константой не является.
0
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
13.10.2011, 16:37
Цитата Сообщение от 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
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.10.2011, 16:37
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru