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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.79
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
#1

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

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

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

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

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

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(){} // деструктор
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2013, 23:23     Что делает конструктор?
Посмотрите здесь:

Что делает функция C++
Что делает cin.get C++
что делает оператор? C++
C++ Что делает программа?
C++ Что это за метод?И что он делает?
C++ Что делает pair?
C++ Что делает строка?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
01.09.2013, 13:55  [ТС]     Что делает конструктор? #61
Вот эту самую строку надо располагать выше обьявления функции! А там посмотрим. //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 минуту
Правда, обьясните, я напрочь туплю!
iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 1
01.09.2013, 14:07     Что делает конструктор? #62
Написано же - создайте конструктор по умолчанию
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
01.09.2013, 14:09  [ТС]     Что делает конструктор? #63
Так. Это раньше я объявляел два объекта типа employee — worker и boss и использовал для обращения к ним точку. Видо теперь, поле создания конструктора так нельзя, и уже нужно использовать другие методы.
iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 1
01.09.2013, 14:17     Что делает конструктор? #64
Dimka-novitsek, почитайте нормальную литературу (справочник Шилдта как раз). Вы не до конца изучили. Конструктор по умолчанию это конструктор, который вызывается, если явно его не указать (как в строке 37). Опишите конструктор employee::employee();
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
01.09.2013, 14:44  [ТС]     Что делает конструктор? #65
Спасибо!! Вы не до конца изучили.Конечно!!
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
01.09.2013, 14:58  [ТС]     Что делает конструктор? #66
Компилировалось!!!!!
Миниатюры
Что делает конструктор?  
ValeryS
Модератор
6514 / 4980 / 460
Регистрация: 14.02.2011
Сообщений: 16,495
01.09.2013, 15:13     Что делает конструктор? #67
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
А теперь стало вдруг ругаться на строку в майне. Фокус в том, что работало, пока я ни добавил конструктор!!
пока ты не добавил конструктор, компилятор сам создавал конструктор по умолчанию
как только ты добавил любой конструктор, по умолчанию пропал, и нужно уже описывать конструктор без параметров
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,222
01.09.2013, 16:14     Что делает конструктор? #68
Цитата Сообщение от ValeryS Посмотреть сообщение
пока ты не добавил конструктор, компилятор сам создавал конструктор по умолчанию
как только ты добавил любой конструктор, по умолчанию пропал, и нужно уже описывать конструктор без параметров
А так же деструктор и конструктор копирования, ну в смысле если ты их не создал, то компилятор их создает автоматически, а если создаешь, то компилятор уже ни чего не создает.
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
01.09.2013, 16:48  [ТС]     Что делает конструктор? #69
Спасибо!!ValeryS и VLK!

Конструктор работает именно с переменными, обьявлеными в классе, верно? А функция-нет?
iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 1
01.09.2013, 16:51     Что делает конструктор? #70
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
Спасибо!!

Конструктор работает именно с переменными, обьявлеными в классе, верно? А функция-нет?
Лолшто? Конструктор это та же функция (я говорю о функциях-членах класса), и работает так же, как и остальные функции-члены. Только вызывается автоматически. О чем вы вообще?
Dimka-novitsek
14 / 14 / 0
Регистрация: 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 секунд
Да нет.. В общем, я не понял.
iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 1
01.09.2013, 17:02     Что делает конструктор? #72
Еще раз - конструктор - функция, следовательно все локальные переменные расположены в области видимости этой функции. У вас в классе есть переменные с таким же именем, по-этому, во избежание конфликта имён, используется запись employee::employee_id, т.е. явно указывается, что переменная является членом класса.
Dimka-novitsek
14 / 14 / 0
Регистрация: 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 минуту
Ведь это деструктор??
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,222
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;
}
Dimka-novitsek
14 / 14 / 0
Регистрация: 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 минуту
Ведь ошибка означает, что я что-л нипанимаю!
alsav22
5415 / 4811 / 442
Регистрация: 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;
 }
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
02.09.2013, 17:16  [ТС]     Что делает конструктор? #77
Спасибо!!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2013, 19:19     Что делает конструктор?
Еще ссылки по теме:

Что делает код? C++
C++ Что делает операция new?
Что делает программа C++
C++ _splitpath что делает?
Что можно сделать, что бы конструктор вызывался один раз при агрегировании? C++

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6514 / 4980 / 460
Регистрация: 14.02.2011
Сообщений: 16,495
02.09.2013, 19:19     Что делает конструктор? #78
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
бинарный "<<": не найден оператор, принимающий правый операнд типа "void"
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
cout << Frisky.QetAge()
ты пытаешься вывести на экран(точнее в поток) значение которое вернет функция член(она же метод)QetAge()
но она ничего не возвращает
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
void QetAge();
о чем тебе и сообщают
Yandex
Объявления
02.09.2013, 19:19     Что делает конструктор?
Ответ Создать тему
Опции темы

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