Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

20.07.2011, 10:22. Просмотров 772. Ответов 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.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.07.2011, 10:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конструктор, немного не понятно (C++):

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

Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования - C++
Разработать класс ThreeAngle для работы с плоскими треугольниками. В качестве членов-данных задаются длины трех сторон треугольника. Класс...

this(Всегда ли вызывается конструктор при не явной передачи объекта в конструктор) - C++
class Test { int i; public: void test(int i) { this -&gt; i = i; } }; Конструктор Test::Test всегда вызывается...

Будет ли определен компилятором конструктор по умолчанию, если есть конструктор с дефолтным параметром? - C++
Добрый день, сразу к делу, есть некий класс class some { int x; public: some(int y = 1) : x(y) {} };

Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include &lt;math.h&gt; #include &lt;algorithm&gt; using...

Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно» - C++
Помогите пожалуйста, хоть с одним из заданий. 1. Создать класс. Написать конструктор по умолчанию, конструктор с параметрами....

17
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
20.07.2011, 10:35 #2
Именно в этой программе он абсолютно ни к чему. Отсюда его можно смело удалить.
0
co6ak
Кошковед
409 / 502 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
20.07.2011, 10:36 #3
конструктор вызывается сразу при объявлении.
C++
1
       balance p[20];
- вызов конструктора
1
fasked
Эксперт С++
4948 / 2528 / 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;
}
Демонстрирует создание временного объекта с помощью конструктора.

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

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

Добавлено через 33 секунды
блин, страницу не обновил...
1
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]? Тогда как?)
0
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,357
Записей в блоге: 2
Завершенные тесты: 1
20.07.2011, 10:44 #7
Цитата Сообщение от Sick2 Посмотреть сообщение
Ну так я его могу удалить и ничего не изменится
попробуй удали конструктор без параметров (а конструктор с параметрами оставь) и посмотри на ошибки компиляции
0
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
20.07.2011, 10:45  [ТС] #8
Цитата Сообщение от fasked Посмотреть сообщение
Еще одно замечание. Код просто отвратительный, за него руки отрывать надо автору. Лучше выбросите эту книгу и возьмите какую-либо общепризнанную
Ну это Шилдта) Какую тогда взять?
0
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
20.07.2011, 10:49 #9
Цитата Сообщение от Sick2 Посмотреть сообщение
Ну это Шилдта) Какую тогда взять?
На мой взгляд лучше "Брюс Эккель - Философия C++".

Ну или просто не привыкай писать такой код, а обращай внимание именно на концептуальные вещи, если речь идет о конструкторе, то обращай внимание только на конструктор, если речь заходит о шаблонах - смотреть исключительно на шаблоны.
В этом коде я слету могу перечислить несколько недостатков, а ведь он настолько небольшой. Хотя по поводу конструтора, все верно пишет. (За исключением его содержимого опять же).
0
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,357
Записей в блоге: 2
Завершенные тесты: 1
20.07.2011, 10:55 #10
Цитата Сообщение от Sick2 Посмотреть сообщение
Ну это Шилдта) Какую тогда взять?
Я тоже с Шилдта начинал (" C++. Руководство для начинающих"), довольно понятно пишет! Наверняка по поводу этого кода там есть какая-нибудь оговорка.
0
fasked
Эксперт С++
4948 / 2528 / 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 дублируется в конструкторе.
Я уже не говорю о возможностях переполнениях буферов, неинициализированных указателей и так далее.
0
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,357
Записей в блоге: 2
Завершенные тесты: 1
20.07.2011, 11:05 #12
Да это все понятно, я думаю он специально такой код для примера вставил, позже в книге наверняка он покажет, как нужно делать правильно.

Цитата Сообщение от fasked Посмотреть сообщение
передача double по ссылке;
А что именно в этом смущает?
0
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
20.07.2011, 11:08 #13
Цитата Сообщение от Kastaneda Посмотреть сообщение
А что именно в этом смущает?
Не вижу смысла, double вроде бы не такой уж и большой. А неконстантная ссылка это всегда дополнительная опасность.
0
ValeryLaptev
Эксперт С++
1042 / 821 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
20.07.2011, 11:25 #14
Цитата Сообщение от Kastaneda Посмотреть сообщение
А что именно в этом смущает?
У меня, например, условный рефлекс за много лет выработался. Если я вижу передачу по ссылке, сразу смотрю, где изменяется параметр и зачем. Особенно это в конструкторе прикалывает. А ну как для инициализации передадут переменную. И сиди гадай: изменил конструктор эту переменную или нет. Надо лезть в текст, смотреть, что и как.
Гораздо лучше, если по прототипу все понятно.
Если уж передавать по ссылке, то по константной. И ссылка, и явное обозначение неизменности параметра.
0
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,357
Записей в блоге: 2
Завершенные тесты: 1
20.07.2011, 11:44 #15
Нет, это все понятно.
Просто весь код написан через ж..., и на общем фоне double по ссылке только дополняет общую картину))
Просто я подумал, что fasked обладает какими-то тайными знаниями, по поводу того, что double (именно double, а не какой-то другой тип) по ссылке - это моветон (почему-то в его фразе я увидел на это намек)
Но ссылка на double это как-то перебор.
0
20.07.2011, 11:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2011, 11:44
Привет! Вот еще темы с ответами:

Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно? - C++
Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?

Конструктор производного класса требует конструктор предка - C++
Выдаёт вот такую вот ошибку: no matching function for call to 'Cube::Cube()' class Cube { protected: int magInt; bool...

Конструктор инициализации, конструктор копирования, деструктор - C++
Я сделал почти задание по перегрузке операторов. Осталось одно, тоесть три: конструктор инициализации, конструктор копирования, деструктор....

Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор - C++
Всем доброго времени суток! нужна ваша помощь! нужно создать класс вектор и реализовать конструктор по умолчанию, копирования и...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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