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

Конструктор, немного не понятно - C++

Восстановить пароль Регистрация
 
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
20.07.2011, 10:22     Конструктор, немного не понятно #1
Всем привет. В одной книге наткнулся на пример с конструктором:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "stdafx.h"
#include <iostream>
 
using namespace std;
class balance
{
    double cur_bal;
    char name[80];
public:
    balance(double &n, char *s)
    {
        cur_bal=n;
        strcpy(name,s);
    };
    balance() {};
 
void get(double &n, char *s)
{
    n = cur_bal;
    strcpy(s,name);
}
void set(double &n, char *s)
{
    cur_bal=n;
    strcpy(name,s);
};
};
 
int _tmain(int argc, _TCHAR* argv[])
{   
    char ff[20];
    char b[20],c[20];
    double n;
    double f;
    
    balance p[20];
for(int i=0;i<2;i++)
{
    cin>>name>>c>>f;
    p[i].set(f,c);
};
 
        for(int i=0;i<2;i++)
        {
            p[i].get(n,b);
            cout<<b<<"------------->"<<n<<endl;
 
            system("pause");
    return 0;
}
Так вот, в книге описывается, что нужно делать, если мы хотим создать неинициализированный массив, т.е.нужно создать перегруженный конструктор без параметров. Но у меня такой вопрос: зачем в этой программе вообще конструктор? Мы ведь его не используем, а вызываем ф-цию set.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.07.2011, 10:22     Конструктор, немного не понятно
Посмотрите здесь:

не понятно... C++
Не понятно C++
C++ не понятно
Не понятно работает C++
как i двигается понятно но вот не понятно как это делает j ? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
20.07.2011, 10:35     Конструктор, немного не понятно #2
Именно в этой программе он абсолютно ни к чему. Отсюда его можно смело удалить.
co6ak
Кошковед
 Аватар для co6ak
403 / 496 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
20.07.2011, 10:36     Конструктор, немного не понятно #3
конструктор вызывается сразу при объявлении.
C++
1
       balance p[20];
- вызов конструктора
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
20.07.2011, 10:38     Конструктор, немного не понятно #4
Цитата Сообщение от Sick2 Посмотреть сообщение
зачем в этой программе вообще конструктор? Мы ведь его не используем, а вызываем ф-цию set.
По желанию, если хочешь использоваться конструктор - используй, если функцию - используй ее. Посмотрите на какие-либо библиотеки. Для большинства классов имеется возможность совершить действия аналогичные конструктору, набором функций. Дело в том, что при создании объекта чаще воспользоваться удобнее именно конструктором - меньше строк кода, возможность использовать временный объект и т.д. Однако, конструктор подходит лишь для создния объекта. Если требуется изменить свойства объекта уже после его создания, то используются функции.
Для Вашего случая можно придумать пару примеров:
C++
1
2
3
4
balance first(4.3, "cyberforum");
 
balance second;
second.set(4.3, "cyberforum");
В данном случае было создано два тождественных объекта, но во-первых, как уже говорилось, меньше строк кода, а во-вторых вытекающее отсюда следствие - инициализация объекта при создании - не надо искать глазами где же и проводилась ли вообще инициализация.

C++
1
2
3
4
5
6
7
8
9
10
11
12
void print_balance(const balance &b1) {
     char str[80] = { 0 };
     double n = 0;
 
     b1.get(n, str);
     std::cout << str << ": " << n << std::endl;
}
 
int main() {
     print_balance(balance(2.07, "cyberforum"));
     return 0;
}
Демонстрирует создание временного объекта с помощью конструктора.

Тем не менее было бы не разумно отнимать у пользователей класса возможность изменять состояние объекта в процессе работы с ним.

Еще одно замечание. Код просто отвратительный, за него руки отрывать надо автору. Лучше выбросите эту книгу и возьмите какую-либо общепризнанную.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
20.07.2011, 10:40     Конструктор, немного не понятно #5
В языке С++ существует такая концепция: "для каждого создаваемого объекта гарантировано будет вызван конструктор", это исключает случайное использование неинициализированных данных.
Но у меня такой вопрос: зачем в этой программе вообще конструктор?
При создании массива объектов для каждого элемента массива будет вызван конструктор по умолчанию (т.е. без аргументов).

Добавлено через 33 секунды
блин, страницу не обновил...
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
20.07.2011, 10:41  [ТС]     Конструктор, немного не понятно #6
Цитата Сообщение от co6ak Посмотреть сообщение
конструктор вызывается сразу при объявлении.
C++
1
       balance p[20];
- вызов конструктора
Ну так я его могу удалить и ничего не изменится
У меня тогда вопрос, если взять пример этой программы и удалить ф-цию сет. Каким образом мы тогда будем заносить данные в класс?
C++
1
balance p(3.3123, "Вася")
Ну это понятно - без массива. А если у нас создан balance p[20]? Тогда как?)
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
20.07.2011, 10:44     Конструктор, немного не понятно #7
Цитата Сообщение от Sick2 Посмотреть сообщение
Ну так я его могу удалить и ничего не изменится
попробуй удали конструктор без параметров (а конструктор с параметрами оставь) и посмотри на ошибки компиляции
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
20.07.2011, 10:45  [ТС]     Конструктор, немного не понятно #8
Цитата Сообщение от fasked Посмотреть сообщение
Еще одно замечание. Код просто отвратительный, за него руки отрывать надо автору. Лучше выбросите эту книгу и возьмите какую-либо общепризнанную
Ну это Шилдта) Какую тогда взять?
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
20.07.2011, 10:49     Конструктор, немного не понятно #9
Цитата Сообщение от Sick2 Посмотреть сообщение
Ну это Шилдта) Какую тогда взять?
На мой взгляд лучше "Брюс Эккель - Философия C++".

Ну или просто не привыкай писать такой код, а обращай внимание именно на концептуальные вещи, если речь идет о конструкторе, то обращай внимание только на конструктор, если речь заходит о шаблонах - смотреть исключительно на шаблоны.
В этом коде я слету могу перечислить несколько недостатков, а ведь он настолько небольшой. Хотя по поводу конструтора, все верно пишет. (За исключением его содержимого опять же).
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
20.07.2011, 10:55     Конструктор, немного не понятно #10
Цитата Сообщение от Sick2 Посмотреть сообщение
Ну это Шилдта) Какую тогда взять?
Я тоже с Шилдта начинал (" C++. Руководство для начинающих"), довольно понятно пишет! Наверняка по поводу этого кода там есть какая-нибудь оговорка.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
20.07.2011, 10:59     Конструктор, немного не понятно #11
Kastaneda, я и не говорю, что он непонятно пишет про язык. Сам код получается слишком уж плохой и неудобный. Вот несколько неясных для меня моментов:
  • передача double по ссылке;
  • что делать, если я хочу получить только cur_bal, без строки;
  • что делать, если я хочу получить только строку, без cur_bal;
  • аналогично по set методу для отдельных cur_bal и строки.
Хорошо, const могли еще не проходить в этой главе (хотя должны были, если классы идут). Но ссылка на double это как-то перебор. Сеттеры и геттеры действительно неудобные.
функция set дублируется в конструкторе.
Я уже не говорю о возможностях переполнениях буферов, неинициализированных указателей и так далее.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
20.07.2011, 11:05     Конструктор, немного не понятно #12
Да это все понятно, я думаю он специально такой код для примера вставил, позже в книге наверняка он покажет, как нужно делать правильно.

Цитата Сообщение от fasked Посмотреть сообщение
передача double по ссылке;
А что именно в этом смущает?
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
20.07.2011, 11:08     Конструктор, немного не понятно #13
Цитата Сообщение от Kastaneda Посмотреть сообщение
А что именно в этом смущает?
Не вижу смысла, double вроде бы не такой уж и большой. А неконстантная ссылка это всегда дополнительная опасность.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
20.07.2011, 11:25     Конструктор, немного не понятно #14
Цитата Сообщение от Kastaneda Посмотреть сообщение
А что именно в этом смущает?
У меня, например, условный рефлекс за много лет выработался. Если я вижу передачу по ссылке, сразу смотрю, где изменяется параметр и зачем. Особенно это в конструкторе прикалывает. А ну как для инициализации передадут переменную. И сиди гадай: изменил конструктор эту переменную или нет. Надо лезть в текст, смотреть, что и как.
Гораздо лучше, если по прототипу все понятно.
Если уж передавать по ссылке, то по константной. И ссылка, и явное обозначение неизменности параметра.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
20.07.2011, 11:44     Конструктор, немного не понятно #15
Нет, это все понятно.
Просто весь код написан через ж..., и на общем фоне double по ссылке только дополняет общую картину))
Просто я подумал, что fasked обладает какими-то тайными знаниями, по поводу того, что double (именно double, а не какой-то другой тип) по ссылке - это моветон (почему-то в его фразе я увидел на это намек)
Но ссылка на double это как-то перебор.
fasked
20.07.2011, 11:49
  #16

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
по поводу того, что double (именно double, а не какой-то другой тип) по ссылке - это моветон (почему-то в его фразе я увидел на это намек)
Правильнее было бы конечно написать вот так:
Но ссылка на double (bool, char, float, ... [нужное подчеркнуть]) это перебор

Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
20.07.2011, 22:20  [ТС]     Конструктор, немного не понятно #17
Цитата Сообщение от Kastaneda Посмотреть сообщение
Я тоже с Шилдта начинал (" C++. Руководство для начинающих"), довольно понятно пишет! Наверняка по поводу этого кода там есть какая-нибудь оговорка.
Ну мне понятно. Раньше читал С.Дэвис "С++ для чайников" имхо, там очень много лишнего(от темы отвлекается).
Кстати, никто так и не ответил, как быть, если у меня нет функции сет и дан массив balance[20]. Как тогда заносить данные?
И ещё вопрос не по теме: как понять врубился ты в материал или нет?)Я читаю, вроде понимаю, могу написать простейший пример) А как сложнее, то...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2011, 22:48     Конструктор, немного не понятно
Еще ссылки по теме:

C++ Конструктор производного класса требует конструктор предка
Конструктор класса не видит конструктор по умолчанию другого класса C++
Не понятно тз C++

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

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
20.07.2011, 22:48     Конструктор, немного не понятно #18
Цитата Сообщение от Sick2 Посмотреть сообщение
как быть, если у меня нет функции сет и дан массив balance[20]
статически вы такой массив просто не сможете создать(про код из 1-го поста), да и динамически тоже

Добавлено через 1 минуту
Цитата Сообщение от Sick2 Посмотреть сообщение
как понять врубился ты в материал или нет?)Я читаю, вроде понимаю, могу написать простейший пример)
практикуйтесь, постепенно усложняя задачу
Yandex
Объявления
20.07.2011, 22:48     Конструктор, немного не понятно
Ответ Создать тему
Опции темы

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