Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/40: Рейтинг темы: голосов - 40, средняя оценка - 4.75
15 / 15 / 2
Регистрация: 26.04.2012
Сообщений: 1,091
1

Что делает конструктор?

27.08.2013, 23:23. Показов 8092. Ответов 77
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я очень плохо понял вобще. Он вроде помогает создать в памяти место для переменных обьявленых в классе??
В каких слуаях его лучше создавать и использовать?Его лучше иметь для каждого класса?

Где его при этом лучше писать- перед классом, позже или внутри?
Почему его-конструктор- можно писать с параметрами и без параметров?
Какие имено такие параметры и зачем конструктор в себя принимает?

Был ли автоматически создан стандартный конструктор при создани класса или обьекта?
Почему компилятор ругается на создание какого-то деструктора?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class  miclasse
 
 { 
   static const int AA=66;
   int RR;
        public :
   int FF;
   char Simvols[104];
   int Funclasse(int brumm);
 }; 
 
int miclasse::Funclasse(int brumm)
{ 
  brumm=FF+ brumm; cout  <<  " brumm "  << brumm  <<  endl; return 0;  } 
miclasse ::~Funclasse(){} // деструктор
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.08.2013, 23:23
Ответы с готовыми решениями:

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

Что в программе делает так, что процессор грузится на 100%?
Я не очень разбираюсь в С++, поэтому прошу вашей подсказки по поводу нагрузки на процессор. Вот...

Я не могу понять что делает данная программа. Точнее что делают функции используемые в это коде
#include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;ctime&gt; using namespace std; int g(int a, int...

Что это за знак >> прочитал что это сдвиг вправо? что он делает
int d=6, c=5,f; f = d &gt;&gt; c; cout&lt;&lt; f; вывод 0

77
15 / 15 / 2
Регистрация: 26.04.2012
Сообщений: 1,091
01.09.2013, 13:55  [ТС] 61
Author24 — интернет-сервис помощи студентам
Вот эту самую строку надо располагать выше обьявления функции! А там посмотрим. //employee(char *, long, float);

Добавлено через 54 секунды
надо смотреть как минимум и предыдущую строку. Спасибо!! Понял.

Добавлено через 9 минут
Прикиньте!! А теперь стало вдруг ругаться на строку в майне. Фокус в том, что работало, пока я ни добавил конструктор!!

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
#include<iostream>
using namespace std;
#include <string.h> 
 
 class employee 
 
 { 
 public: 
    char name [64]; 
    long employee_id; 
    float salary; 
    employee(char *, long, float);
    void show_employee(void) 
     
 
    { 
       cout << "Имя:  " << name << endl; 
       cout << "Номер служащего: "  << employee_id << endl; 
       cout << "Оклад:  " << salary << endl; 
    }; 
 }; 
 
 employee::employee(char *name, long employee_id,  float salary) 
 
 { 
    strcpy(employee::name, name) ; 
    employee::employee_id = employee_id; 
    if (salary < 50000.0) 
       employee::salary = salary; 
    else  // Недопустимый оклад 
       employee::salary = 0.0; 
 }
 
 void main(void) 
 
 { 
    employee worker, boss; 
    strcpy(worker.name, "John Doe"); 
    worker.employee_id = 12345; 
    worker.salary = 25000; 
    strcpy(boss.name, "Happy Jamsa"); 
    boss.employee_id = 101; 
    boss.salary = 101101.00; 
    worker.show_employee(); 
    boss.show_employee();
    system("pause");
 
 }
1>d:\проги\reshenie\employee\employee.cpp(37): error C2512: employee: нет подходящего конструктора по умолчанию
1>d:\проги\reshenie\employee\employee.cpp(37): error C2512: employee: нет подходящего конструктора по умолчанию

Добавлено через 1 минуту
Правда, обьясните, я напрочь туплю!
0
163 / 104 / 14
Регистрация: 17.10.2012
Сообщений: 488
01.09.2013, 14:07 62
Написано же - создайте конструктор по умолчанию
1
15 / 15 / 2
Регистрация: 26.04.2012
Сообщений: 1,091
01.09.2013, 14:09  [ТС] 63
Так. Это раньше я объявляел два объекта типа employee — worker и boss и использовал для обращения к ним точку. Видо теперь, поле создания конструктора так нельзя, и уже нужно использовать другие методы.
0
163 / 104 / 14
Регистрация: 17.10.2012
Сообщений: 488
01.09.2013, 14:17 64
Dimka-novitsek, почитайте нормальную литературу (справочник Шилдта как раз). Вы не до конца изучили. Конструктор по умолчанию это конструктор, который вызывается, если явно его не указать (как в строке 37). Опишите конструктор employee::employee();
1
15 / 15 / 2
Регистрация: 26.04.2012
Сообщений: 1,091
01.09.2013, 14:44  [ТС] 65
Спасибо!! Вы не до конца изучили.Конечно!!
0
15 / 15 / 2
Регистрация: 26.04.2012
Сообщений: 1,091
01.09.2013, 14:58  [ТС] 66
Компилировалось!!!!!
Миниатюры
Что делает конструктор?  
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
01.09.2013, 15:13 67
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
А теперь стало вдруг ругаться на строку в майне. Фокус в том, что работало, пока я ни добавил конструктор!!
пока ты не добавил конструктор, компилятор сам создавал конструктор по умолчанию
как только ты добавил любой конструктор, по умолчанию пропал, и нужно уже описывать конструктор без параметров
1
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
01.09.2013, 16:14 68
Цитата Сообщение от ValeryS Посмотреть сообщение
пока ты не добавил конструктор, компилятор сам создавал конструктор по умолчанию
как только ты добавил любой конструктор, по умолчанию пропал, и нужно уже описывать конструктор без параметров
А так же деструктор и конструктор копирования, ну в смысле если ты их не создал, то компилятор их создает автоматически, а если создаешь, то компилятор уже ни чего не создает.
1
15 / 15 / 2
Регистрация: 26.04.2012
Сообщений: 1,091
01.09.2013, 16:48  [ТС] 69
Спасибо!!ValeryS и VLK!

Конструктор работает именно с переменными, обьявлеными в классе, верно? А функция-нет?
0
163 / 104 / 14
Регистрация: 17.10.2012
Сообщений: 488
01.09.2013, 16:51 70
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
Спасибо!!

Конструктор работает именно с переменными, обьявлеными в классе, верно? А функция-нет?
Лолшто? Конструктор это та же функция (я говорю о функциях-членах класса), и работает так же, как и остальные функции-члены. Только вызывается автоматически. О чем вы вообще?
1
15 / 15 / 2
Регистрация: 26.04.2012
Сообщений: 1,091
01.09.2013, 17:00  [ТС] 71
Щас.

Добавлено через 3 минуты
Вот в этой конструкции
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
employee::employee(char *name, long employee_id,  float salary) 
 
 { 
    strcpy(employee::name, name) ; 
    employee::employee_id = employee_id; 
   do 
 
    { 
       cout << "Введите оклад для  " << name << " меньше $50000: "; 
       cin >> employee::salary; 
    } 
    while (salary >= 50000.0);
 }
char *name, long employee_id, float salary сущиствуют только внутри конструктора? Тогда зачем я обьявлял их в классе?

Добавлено через 1 минуту
Короче, они сущиствуют только внутри конструктора, я понял.

Добавлено через 35 секунд
Да нет.. В общем, я не понял.
0
163 / 104 / 14
Регистрация: 17.10.2012
Сообщений: 488
01.09.2013, 17:02 72
Еще раз - конструктор - функция, следовательно все локальные переменные расположены в области видимости этой функции. У вас в классе есть переменные с таким же именем, по-этому, во избежание конфликта имён, используется запись employee::employee_id, т.е. явно указывается, что переменная является членом класса.
1
15 / 15 / 2
Регистрация: 26.04.2012
Сообщений: 1,091
01.09.2013, 23:27  [ТС] 73
Нет, подождите..

Добавлено через 20 секунд
Да, спасибо!!

Добавлено через 6 часов 23 минуты
А что тут делает деструктор, да еще и сразу же после конструктора?? Ведб он его должен сразу убрать??

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class employee 
 
 { 
 public: 
    employee(char *, long, float); 
    ~employee(void); 
    void show_employee(void); 
    int change_salary(float); 
    long get_id(void); 
 private: 
    char name [64] ; 
    long employee_id; 
    float salary; 
 };
Добавлено через 1 минуту
Ведь это деструктор??
0
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
02.09.2013, 13:24 74
Dimka-novitsek, вот смотри, делаем класс хуман, человек по нашему:

Кликните здесь для просмотра всего текста
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
#include <iostream>
 
#include <string>
using std::string;
 
class chelovek
{
public:
string imya;
int vozrast;
int ves;
int rost;
string made_in;
/* данные класса специально открытые (public) что бы не писать 
функции get и set, что бы не тратить просто так время */
};
 
int main()
{
chelovek first;
 
first.imya = "Vasek";
first.vozrast = 20;
first.rost = 170;
first.ves = 120;
first.made_in = "china";
 
system("pause");
return 0;
}



строчка 20 мы создаем объект класса (объект first, класс chelovek), потом в строчка 22, 23, 24, 25, 26, мы задаем ему параметры. 6 строчек, а представь что у тебя 1000 человек (объектов).

Было бы не плохо, если бы все это можно было объединить всего в одну строчку, в более простой форме, для этого существует конструктор (в том числе для этого), теперь смотри:

Кликните здесь для просмотра всего текста
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
#include <iostream>
 
#include <string>
using std::string;
 
class chelovek
{
public:
string imya;
int vozrast;
int ves;
int rost;
string made_in;
/* данные класса специально открытые (public) что бы не писать 
функции get и set, что бы не тратить просто так время */
 
chelovek() { imya = "Unnammed"; vozrast = 0; ves = 0; rost = 0; made_in  = "Mars"; }
chelovek(string N, int VZ, int VS, int R, string M) 
{ imya = N; vozrast = VZ; ves = VS; rost = R; made_in  = M; }
};
 
int main()
{
chelovek first("Vasek", 20, 170, 120, "china" );
 
system("pause");
return 0;
}


лучше стало? проще?

Сам конструктор по мимо работы с переменными класса может работать и с другими вещами, например вызывать посторонние функции:

Кликните здесь для просмотра всего текста
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
#include <iostream>
 
#include <string>
using std::string;
 
void fun()
{ std::cout << "Message in fun()!\n"; }
/* выше класса, потому что переменная или функция 
должно быть созданы (объявлены) до того, как они будут использоваться */
 
class chelovek
{
public:
string imya;
int vozrast;
int ves;
int rost;
string made_in;
/* данные класса специально открытые (public) что бы не писать 
функции get и set, что бы не тратить просто так время */
 
chelovek() { imya = "Unnammed"; vozrast = 0; ves = 0; rost = 0; made_in  = "Mars"; fun(); }
chelovek(string N, int VZ, int VS, int R, string M) 
{ imya = N; vozrast = VZ; ves = VS; rost = R; made_in  = M; fun(); }
};
 
 
int main()
{
chelovek first("Vasek", 20, 170, 120, "china" );
 
system("pause");
return 0;
}


Моя тебе рекомендация, всегда в классе создавай конструктор по умолчанию (т.е. без параметров) и конструктор с параметрами, я не буду расписывать почему, это на полстраницы текста, когда дойдешь до наследования, STL тогда поймешь.

Добавлено через 14 минут
Деструктор используется для удаления (разрушения объекта), после того как он стал не нужен, если у тебя в классе простые (статичные) переменные:

C++
1
2
3
4
5
6
class MyClass
{
int x;
int y;
int z;
};
то деструктор по большому счету не нужен, но если у тебя в классе используются динамические переменные (не помню как точно называется, это во всем наркотики виноваты) под которые выделяется память, то деструктор нужен (необходим) т.к. если его не будет, будет происходить утечка памяти.

если ты не сталкивался с динамическими переменными, т.е. не встречал такие слова как new, delete, тогда можешь пока что не напрягаться.
Если хочешь проверить как происходит утечка памяти, воспользуйся этой программой:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
void fun()
{
double *test = new double[9999];
}
 
int main()
{
 
for (int i = 0; i < 9999; i++)
{ fun(); }
 
system("pause");
return 0;
}


скомпилируй, запусти диспетчер задач и запусти программу, посмотри как будет улетать твоя оперативная память.

а потом добавь всего одну строчку в эту программу, в функцию fun() и посмотри как уже улетать ни чего не будет:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
void fun()
{
double *test = new double[9999];
delete[] test;
}
 
int main()
{
 
for (int i = 0; i < 9999; i++)
{ fun(); }
 
system("pause");
return 0;
}
1
15 / 15 / 2
Регистрация: 26.04.2012
Сообщений: 1,091
02.09.2013, 17:09  [ТС] 75
Спасибо, VLK!!! Я минут назад увидел сообщение, ,,пробежал,, его, щас почитаю подробнее!

А вот, если можно, подскажите кто-н, что хочет тут компилятор.

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
51
52
53
54
55
56
57
58
59
60
61
62
// Пример определения методов в
 // объявлении класса
#include<iostream>
using namespace std; // для объекта cout
 
 class Cat // начало объявления класса
 {
  public: // начало раздела public
    int GetAge(); // метод доступа
    void SetAge (int age); // метод доступа
    void Meow(); // обычный метод
    void QetAge();
 private: // начало раздела
    int itsAge; // переменная-член
 
 };
 
// GetAge, открытая функция доступа,
// возвращает значение переменной-члена itsAge
int Cat::GetAge()
 {
  return itsAge;
 }
 
 // Определение открытой функции доступа SetAge
 // Функция SetAge
 // инициирует переменную-член itsAge
 void Cat::SetAge(int age)
 {
    // устанавливаем переменную-член itsAge равной
    // значению, переданному с помощью параметра age
  itsAge = age;
 }
 
 // Определение метода Meow
 // возвращает void
 // параметров нет
 // используется для вывода на экран текста "Meow"
 
 void Cat::Meow()
 {
   cout << "Meow.\n";
 }
 
 // Создаем виртуальную кошку, устанавливаем ее возраст, разрешаем
 // ей мяукнуть, сообщаем ее возраст, затем снова "мяукаем".
 
 void Cat::QetAge()
 {
   cout << itsAge;
 }
 
 int main()
 {
    Cat Frisky;
    Frisky.SetAge(5);
    Frisky.Meow();
    cout << "Frisky is а cat who is ";
    cout << Frisky.QetAge() << " years old.\n";
    Frisky.Meow();
    return 0;
 }

1>d:\проги\resheniefrisky\frisky\frisky.cpp(59): error C2679: бинарный "<<": не найден оператор, принимающий правый операнд типа "void" (или приемлемое преобразование отсутствует)
1> d:\documents\читать\с++\vc\include\ostream(679): может быть "std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)"
1> with( и дальше еще примерно 140 строк нивразумитильной писанины..... )

Добавлено через 1 минуту
Ведь ошибка означает, что я что-л нипанимаю!
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.09.2013, 17:14 76
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
 {
    Cat Frisky;
    Frisky.SetAge(5);
    Frisky.Meow();
    cout << "Frisky is a cat who is ";
    Frisky.QetAge();
    cout << " years old.\n";
    Frisky.Meow();
    return 0;
 }
1
15 / 15 / 2
Регистрация: 26.04.2012
Сообщений: 1,091
02.09.2013, 17:16  [ТС] 77
Спасибо!!
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
02.09.2013, 19:19 78
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
бинарный "<<": не найден оператор, принимающий правый операнд типа "void"
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
cout << Frisky.QetAge()
ты пытаешься вывести на экран(точнее в поток) значение которое вернет функция член(она же метод)QetAge()
но она ничего не возвращает
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
void QetAge();
о чем тебе и сообщают
1
02.09.2013, 19:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.09.2013, 19:19
Помогаю со студенческими работами здесь

что такое super.onCreate(savedInstanceState);? что оно делает?
подскажите, начинающему программисту под android, что делает строка...

Дать понять пользователю, что программа что-то делает, а не зависла
Написал программу для поиска текста в файлах, но т.к. файлов много программа &quot;зависает&quot; на время...

Какова вероятность того, что родители увидят, что сын делает уроки
Ученику нужно сделать 5 предметов. 10% рабочего времени он тратит на Физику, 20% - на Биологию, 25%...

Добрый вечер. move_uploaded_file делает не совсем то, что мне нужно, что я сделал не так?
Хочу сохранить файл в папку uploads, лежащую в корневой директории сайта. Но вместо этого файл (мп3...


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

Или воспользуйтесь поиском по форуму:
78
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru