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

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

Войти
Регистрация
Восстановить пароль
 
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
#1

Что за присвоение? - C++

29.06.2013, 12:24. Просмотров 333. Ответов 7
Метки нет (Все метки)

вот код с http://www.cplusplus.com/doc/tutorial/classes/
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
 
class CRectangle {
    int *width, *height;
  public:
    CRectangle (int,int);
    ~CRectangle ();
    int area () {return (*width * *height);}
};
 
CRectangle::CRectangle (int a, int b) {
  width = new int;
  height = new int;
  *width = a;
  *height = b;
}
 
CRectangle::~CRectangle () {
  delete width;
  delete height;
}
всё понятно кроме
C++
1
2
*width = a;
*height = b;
почему не просто
C++
1
2
width = a;
height = b;
?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.06.2013, 12:24     Что за присвоение?
Посмотрите здесь:

Присвоение типов в С++ C++
C++ Присвоение значений
присвоение typeid C++
C++ Не выполняет присвоение
Присвоение значений C++
C++ вывод, присвоение
функция rand и присвоение C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DPS
32 / 32 / 3
Регистрация: 12.11.2011
Сообщений: 107
Завершенные тесты: 1
29.06.2013, 12:31     Что за присвоение? #2
width, height - это адреса указателей
*width, *height - значения.

Соответственно, здесь
C++
1
2
*width = a;
*height = b;
присваиваются значения
Убежденный
Системный программист
Эксперт С++
14908 / 6726 / 1059
Регистрация: 02.05.2013
Сообщений: 11,008
Завершенные тесты: 1
29.06.2013, 12:31     Что за присвоение? #3
"width = x" - это присвоение значения x указателю width.
А "*width = x" - это присвоение значения x ячейке, на которую указывает указатель width.
Expocooky
56 / 56 / 2
Регистрация: 06.06.2013
Сообщений: 112
29.06.2013, 12:31     Что за присвоение? #4
Это указатели. Для того чтобы записать значение, нужно сначала перейти по адресу, лежащему в указателе, с помощью оператора *
Убежденный
Системный программист
Эксперт С++
14908 / 6726 / 1059
Регистрация: 02.05.2013
Сообщений: 11,008
Завершенные тесты: 1
29.06.2013, 12:33     Что за присвоение? #5
А вместо этого:
C++
1
2
3
4
5
6
CRectangle::CRectangle (int a, int b) {
  width = new int;
  height = new int;
  *width = a;
  *height = b;
}
Лучше так:
C++
1
2
3
4
CRectangle::CRectangle (int a, int b) :
    width(new int(a)), height(new int(b))
{
}
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
29.06.2013, 12:45  [ТС]     Что за присвоение? #6
Цитата Сообщение от Убежденный Посмотреть сообщение
"width = x" - это присвоение значения x указателю width.
А "*width = x" - это присвоение значения x ячейке, на которую указывает указатель width.
вот это мне прояснило ситуацию!
Цитата Сообщение от Убежденный Посмотреть сообщение
Лучше так:
CRectangle::CRectangle (int a, int b) :
width(new int(a)), height(new int(b))
{
}
стильная запись) а что означает " : " после CRectangle (int a, int b)
gray_fox
What a waste!
1253 / 1136 / 54
Регистрация: 21.04.2012
Сообщений: 2,359
Завершенные тесты: 3
29.06.2013, 13:45     Что за присвоение? #7
Цитата Сообщение от soican Посмотреть сообщение
что означает " : "
Список инициализации конструктора, все поля класса инициализируются с помощью него.

Не по теме:

Цитата Сообщение от Убежденный Посмотреть сообщение
C++
1
2
CRectangle::CRectangle (int a, int b)
   : width(new int(a)), height(new int(b)) { }
Такой вопрос: будет ли утечка памяти, если new int(b) выкинет bad_alloc?



Добавлено через 18 минут

Не по теме:

Да, будет, туплю, вопрос снимается)

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.06.2013, 15:59     Что за присвоение?
Еще ссылки по теме:

C++ Присвоение структур
C++ Присвоение указателей
присвоение значения C++
Присвоение в цикле C++
Странное присвоение переменной C++

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

Или воспользуйтесь поиском по форуму:
Убежденный
Системный программист
Эксперт С++
14908 / 6726 / 1059
Регистрация: 02.05.2013
Сообщений: 11,008
Завершенные тесты: 1
29.06.2013, 15:59     Что за присвоение? #8
Цитата Сообщение от gray_fox Посмотреть сообщение
Такой вопрос: будет ли утечка памяти, если new int(b) выкинет bad_alloc?
Будет. И это очень хороший вопрос.

Надежная реализация конструктора должна обрабатывать такую ситуацию.
Например, обернуть операции выделения памяти в блок try-catch, а в случае
исключения подчистить за собой и пробросить исключение дальше.

Другой вариант связан с использованием умных указателей, которые сами
управляют временем жизни объекта и уничтожают его в нужные моменты.

Очень хорошо про это написано у Герба Саттера в книге "Решение сложных
задач на С++", а также в книге "С++ сборник рецептов" (Д. Стефенс,
К. Диггинс, Д. Турканис, Д. Когсуэлл).
Yandex
Объявления
29.06.2013, 15:59     Что за присвоение?
Ответ Создать тему
Опции темы

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