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

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

Войти
Регистрация
Восстановить пароль
 
 
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
#1

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

20.07.2011, 10:22. Просмотров 757. Ответов 17
Метки нет (Все метки)

Всем привет. В одной книге наткнулся на пример с конструктором:
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     Конструктор, немного не понятно
Посмотрите здесь:

как i двигается понятно но вот не понятно как это делает j ? - C++
Здравствуйте, вопрос очень глупы но все же есть цикл for (int i = 0,j = 0; i &lt; source.length; i++) как i двигается понятно но вот не...

Не понятно - C++
Вот девчонка попросила написать программу,у меня не получилось,не поможите?

не понятно... - C++
дано целое число N&gt;0.использовать операции деления нацело и взятия остатка от деления, найти число, полученное при прочитании чмсла N...

Не понятно тз - C++
Задание: cоставить программу, которая для каждого значения аргумента X от начального X0 до коненого Xn, с шагом dx выполняет следующие...

не понятно - C++
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; int main () { int **mas, n, m, i, j, j1; double dva, ras,...

Не понятно работает - C++
программа должна выводить число, но выводит &quot;nan&quot;. что это значит? #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
20.07.2011, 10:35     Конструктор, немного не понятно #2
Именно в этой программе он абсолютно ни к чему. Отсюда его можно смело удалить.
co6ak
Кошковед
407 / 500 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
20.07.2011, 10:36     Конструктор, немного не понятно #3
конструктор вызывается сразу при объявлении.
C++
1
       balance p[20];
- вызов конструктора
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,250
Записей в блоге: 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
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,250
Записей в блоге: 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
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
20.07.2011, 10:49     Конструктор, немного не понятно #9
Цитата Сообщение от Sick2 Посмотреть сообщение
Ну это Шилдта) Какую тогда взять?
На мой взгляд лучше "Брюс Эккель - Философия C++".

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

Цитата Сообщение от fasked Посмотреть сообщение
передача double по ссылке;
А что именно в этом смущает?
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
20.07.2011, 11:08     Конструктор, немного не понятно #13
Цитата Сообщение от Kastaneda Посмотреть сообщение
А что именно в этом смущает?
Не вижу смысла, double вроде бы не такой уж и большой. А неконстантная ссылка это всегда дополнительная опасность.
ValeryLaptev
Эксперт С++
1039 / 818 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
20.07.2011, 11:25     Конструктор, немного не понятно #14
Цитата Сообщение от Kastaneda Посмотреть сообщение
А что именно в этом смущает?
У меня, например, условный рефлекс за много лет выработался. Если я вижу передачу по ссылке, сразу смотрю, где изменяется параметр и зачем. Особенно это в конструкторе прикалывает. А ну как для инициализации передадут переменную. И сиди гадай: изменил конструктор эту переменную или нет. Надо лезть в текст, смотреть, что и как.
Гораздо лучше, если по прототипу все понятно.
Если уж передавать по ссылке, то по константной. И ссылка, и явное обозначение неизменности параметра.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2011, 11:44     Конструктор, немного не понятно
Еще ссылки по теме:

Не понятно шо за ошибка? - C++
Здорова! Пытаюсь создать список вот код: #include &lt;iostream&gt; using std::cout; using std::endl; using std::cin; ...

Не понятно с сортировкой! - C++
Добрый вечер! Возникла неясность с пузырьковой сортировкой. В чём загвоздка? В задании надо присвоить в структуру оператор &lt;, чтобы...

printf sprintf не понятно - C++
Почему в printf строка отображается нормально, а sprintf вместо строки вставляет &quot;(null)&quot; ? что нужно сделать со строкой что бы она...

Не много не понятно (dynamic_cast) - C++
Вот например есть 2 класса: #include &lt;iostream&gt; class One { }; class Two : public One


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

Или воспользуйтесь поиском по форуму:
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,250
Записей в блоге: 1
Завершенные тесты: 1
20.07.2011, 11:44     Конструктор, немного не понятно #15
Нет, это все понятно.
Просто весь код написан через ж..., и на общем фоне double по ссылке только дополняет общую картину))
Просто я подумал, что fasked обладает какими-то тайными знаниями, по поводу того, что double (именно double, а не какой-то другой тип) по ссылке - это моветон (почему-то в его фразе я увидел на это намек)
Но ссылка на double это как-то перебор.
Yandex
Объявления
20.07.2011, 11:44     Конструктор, немного не понятно
Ответ Создать тему
Опции темы

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