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

Действие конструктора вобще не понял - C++

Восстановить пароль Регистрация
 
 
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
11.09.2013, 13:35     Действие конструктора вобще не понял #1
Вобще не понял, зачем нужен конструктор.
Ведь написано Как же инициализировать переменные-члены класса? Для этого в классе используется специальная функция-член, называемая конструктором.

Я думал, конструктор нужен только потому, что в классе нельзя написать просто int initialAge=5 и как- либо работать с переменной.

Я теперь наоборот в легком шоке. Переменную, инициализированную в конструкторе, не видно! Так таки зачем он тогда нужен??

Если можно, приведите пару-тройку понятных примеров использования конструктора, пожалуста! Где он и каким бывает и что и как делает.

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <string> 
#include <iostream> // для объекта cout
using namespace std;
 
#include<iomanip>
//Этот файл содержит большую часть манипуляторов C++. Если вы не знаете, что такое манипулятор, не беспокойтесь. Просто подключите это файл вместе с iostream, хуже не станет.
#include<fstream> 
//Подключается при работе с файлами.
 
   class Cat
        {
     public:
        
        Cat(int initialAge=5); 
        ~Cat();
        int GetAge() const; // метод доступа const функция доступа к данным-членам класса без права их изменения
        void SetAge (int age);
        void Meow();
        void Wydam()  {Bam();};   //статический метод
        int Bgsamm();
        void Metod(int);
      private:
        int itsAge; // статические переменные класса (Статическое поле)
        int B;
        
    //  Cat(){itsAge=0; B=8;};
        void Bam( ){cout << "Wydam\n";
                                  int BG=itsAge+ B;
                                  cout << BG;   } 
        
        };
                                          
 // конструктор класса Cat
  Cat::Cat(int initialAge)
   {
   itsAge = initialAge;
   cout << "Cat constructor\n";
   }
 
  Cat::~Cat() // деструктор, который не выполняет никаких действий
  {
  cout << "Cat destructor\n";
  }
 
 
 
 int Cat::Bgsamm() 
 {
  return (itsAge++); 
 }
 
 
 
 
 // определение функции SetAge как открытого
 // метода доступа к данным класса
 void Cat::SetAge(int age)
 {
    // присваиваем переменной-члену itsAge
    // значение переданного парйметра age
  itsAge = age;
 }
 
 
 
      // Определение метода Meow
      // возвращает void
      // параметров нет
      // используется для вывода на экран текста "Meow"
  void Cat::Meow()
  {
  cout << "Meow.\n";
  }
 
 
 
  Cat obyekt;
  void Cat::Metod (int tselaya=100) //обычный метод
  {tselaya=tselaya+initialAge; cout << tselaya;cout << "  целая\n";}      
 
 int main()
 {
     Cat Frisky; 
     Frisky.Meow();
    
     cout << obyekt.GetAge();
     obyekt.Bgsamm();
     obyekt.Wydam();
     obyekt. Bam();
     obyekt.Metod();
     system("pause");
    return 0;
 }

1>d:\проги\resheniecathapi8pi\cathapi8pi\cathapi8pi.cpp(79): error C2065: initialAge: необъявленный идентификатор
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5437 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
11.09.2013, 13:41     Действие конструктора вобще не понял #2
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
Переменную, инициализированную в конструкторе, не видно!
А как вы на нее смотрите?
Вот тут ее должно быть видно:
C++
1
cout << obyekt.GetAge();
(строка 86)
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
11.09.2013, 13:43     Действие конструктора вобще не понял #3
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
Так таки зачем он тогда нужен??
конструктор автоматически вызывается при создании объекта. в нем можно проинициализировать private переменные

а вот чтобы получить доступ к этим самым private переменным, нужна public функция. И только через эту функцию можно изменить переменные. Это сделано в целях безопасности. У кого нет правд доступа к private-переменным класса, тот и не должен туда лезть
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
11.09.2013, 13:46  [ТС]     Действие конструктора вобще не понял #4
Я в полной запутанасти.
...Ну, хорошо. Значит, конструктор- это как функция, но порядком ущербная, наружу в принципе ничего не может выдать... ??

Добавлено через 26 секунд
А! Вижу ответы!! Спасибо!!!
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5437 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
11.09.2013, 13:47     Действие конструктора вобще не понял #5
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
наружу в принципе ничего не может выдать
Ее суть - в создании объекта. И может он наружу выдать.
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
11.09.2013, 14:02  [ТС]     Действие конструктора вобще не понял #6
Может, ее там и видно, да, не спорю.

А чем вызвана указаная компилятором ошибка? Как было бы правильно ее инициализировать?

Добавлено через 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
49
50
51
52
53
Листинг 6.4. Использование конструкторов и деструкторов.
 
1: // Пример объявления конструктора и
 
2: // деструктора в классе Cat
 
3:
 
4: #include <iostream.h> // для объекта cout
 
5:
 
6: class Cat // начало объявления класса
 
7: {
 
8: public: // начало открытого раздела
 
9:    Cat(int initialAge); // конструктор
 
10:   ~Cat(); //деструктор
 
11:   int GetAge(); // метод доступа
 
12:   void SetAge(int age); // метод доступа
 
13:   void Meow();
 
14: private: // начало закрытого раздела
 
15:   int itsAge; // переменная-член
 
16: };
 
17:
 
18: // конструктор класса Cat
 
19: Cat::Cat(int initialAge)
 
20: {
 
21:    itsAge = initialAge;
 
22: }
 
23:
 
24: Cat::~Cat() // деструктор, не выполняющий действий
 
25: {
 
26: }
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5437 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
11.09.2013, 14:07     Действие конструктора вобще не понял #7
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
А чем вызвана указаная компилятором ошибка?
Тем что вот в этом месте (77 строка):
C++
1
2
3
  Cat obyekt;
  void Cat::Metod (int tselaya=100) //обычный метод
  {tselaya=tselaya+initialAge; cout << tselaya;cout << "  целая\n";}
Вы пытаетесь обратится к переменной initialAge, которой не существует. Она не объявлена нигде. Она упоминается только как имя передаваемого параметра в описании самого конструктора:
C++
1
Cat::Cat(int initialAge)
Вне конструктора она не видна.
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
Как было бы правильно ее инициализировать?
Не совсем верно. Ее не надо инициализировать. В данном случае надо воспользоваться методам класса, возвращающим значение этой переменной:
C++
1
2
3
  Cat obyekt;
  void Cat::Metod (int tselaya=100) //обычный метод
  {tselaya=tselaya+GetAge; cout << tselaya;cout << "  целая\n";}
где GatAge описан как:
C++
1
2
3
4
 int Cat::GetAge() 
 {
  return itsAge; 
 }

Не по теме:

Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
А вот пример- из книги
Архангельский? ))


Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
Это перегруженый конструктор
Где?
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
11.09.2013, 14:08     Действие конструктора вобще не понял #8
поясню назначение конструкторов.

Допустим есть класс для хранения даты рождения:
У него отсутствует конструктор, но есть две функции. одна устанавливает дату, другая печатает дату

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
class BirthDate
{
private:
    int day;    // допустимые значения 1..31 (в разные месяцы по-разному)
    int month;  // 1..12
    int year;   // приблизительно 1900..2100 (можно другое установить)
 
public:
    void SetDate(int d, int m, int y)
    {
        day = (d>=1 && d<=31) ? d : 1;
        month = (m>=1 && m<=12) ? m : 1;
        year = (y>=1900 && y<=2100) ? m : 1900;
    }
 
    void Show() const
    {
        cout << day << "/" << month << "/" << year << endl;
    }
};
 
 
int main()
{
    BirthDate   d;
 
    // случайно забыли вызвать функцию для установки даты
 
    d.Show();   // 0/0/2147315712
 
    return 0;
}
даты 0/0/2147315712 вообще не существует и последствия от этого в дальнейшем могут оказаться печальными

Но если бы у нас был конструктор
C++
1
2
3
4
BirthDate(int d, int m, int y)
{
    SetDate(d, m, y);
}
то уже пришлось бы создавать объект таким способом:
BirthDate d(11, 9, 2013);

т.е. точно указывать дату рождения. и по другому никак.
следовательно в объекте d в принципе не могут находится ошибочные данные,
т.к. при создании объекта автоматически вызывается конструктор, устанавливающий правильную дату
а все остальные попытки изменить ее проверяются функцией SetDate()
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
11.09.2013, 14:40  [ТС]     Действие конструктора вобще не понял #9
СПАСИБО!!!

Добавлено через 8 минут
Архангельский? ))
Джесс Либерти: Освой самостоятельно C++ за 21 день

Где?
Вот
C++
1
Cat(int initialAge); // конструктор
C++
1
2
3
4
5
// конструктор класса Cat
Cat::Cat(int initialAge)
{
  itsAge = initialAge;
}
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5437 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
11.09.2013, 15:16     Действие конструктора вобще не понял #10
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
Вот
Нет. Это не перегруженный конструктор. В этом примере в девятой строке объявление констрктора:
C++
1
Cat(int initialAge); // конструктор
А в девятнадцатой реализация:
C++
1
2
3
4
5
// конструктор класса Cat
Cat::Cat(int initialAge)
{
  itsAge = initialAge;
}
Можно было и прям в классе написать это все, ничего бы не изменилось. Но так делается, разносится для удобочитаемости. Если много кода. Чтобы не загромождать перечисление методов класса.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Cat // начало объявления класса
{
public: // начало открытого раздела
Cat(int initialAge)
  {
  itsAge = initialAge;
  }; // конструктор
~Cat(); //деструктор
int GetAge(); // метод доступа
void SetAge(int age); // метод доступа
void Meow();
private: // начало закрытого раздела
int itsAge; // переменная-член
};
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
11.09.2013, 16:14  [ТС]     Действие конструктора вобще не понял #11
Спасибо!!!

А вот, ну не пойму, что тут компилятору не нравится.

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <string> 
#include <iostream> // для объекта cout
using namespace std;
 
#include<iomanip>
//Этот файл содержит большую часть манипуляторов C++. Если вы не знаете, что такое манипулятор, не беспокойтесь. Просто подключите это файл вместе с iostream, хуже не станет.
#include<fstream> 
//Подключается при работе с файлами.
 
   class Cat
        {
     public:
        
        Cat(int initialAge=5); 
        ~Cat();
        int GetAge() const; // метод доступа const функция доступа к данным-членам класса без права их изменения
        void SetAge (int age);
        void Meow();
        void Wydam()  {Bam();};   //статический метод
        int Bgsamm();
        void Metod(int);
      private:
        int itsAge; // статические переменные класса (Статическое поле)
        int B;
        
    //  Cat(){itsAge=0; B=8;};
        void Bam( ){cout << "Wydam\n";
                                  int BG=itsAge+ B;
                                  cout << BG;   } 
        
        };
                                          
 // конструктор класса Cat
  Cat::Cat(int initialAge)
   {
   itsAge = initialAge;
   cout << "Cat constructor\n";
   }
 
  Cat::~Cat() // деструктор, который не выполняет никаких действий
  {
  cout << "Cat destructor\n";
  }
 
 
 
 int Cat::Bgsamm() 
 {
  return (itsAge++); 
 }
 
 
 
 
 // определение функции SetAge как открытого
 // метода доступа к данным класса
 void Cat::SetAge(int age)
 {
    // присваиваем переменной-члену itsAge
    // значение переданного парйметра age
  itsAge = age;
 }
 
     int Cat::GetAge()
      {
       return itsAge;
      }
 
 
 
      // Определение метода Meow
      // возвращает void
      // параметров нет
      // используется для вывода на экран текста "Meow"
  void Cat::Meow()
  {
  cout << "Meow.\n";
  }
 
 
 
  Cat obyekt;
  void Cat::Metod (int tselaya=100) //обычный метод
  {tselaya=tselaya+GetAge(); cout << tselaya;cout << "  целая\n";}    
 
 int main()
 {
     Cat Frisky; 
     Frisky.Meow();
    
     cout << объект.GetAge();
     obyekt.Bgsamm();
     obyekt.Wydam();
     obyekt. Bam();
     obyekt.Metod();
     system("pause");
    return 0;
 }
1>d:\проги\resheniecathapi8pi\cathapi8pi\cathapi8pi.cpp(65): error C2511: int Cat::GetAge(void): перегруженная функция-член не найдена в "Cat"
coloc
погромист
 Аватар для coloc
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
11.09.2013, 17:48     Действие конструктора вобще не понял #12
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
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <string> 
#include <cstdlib>
#include <iostream> // äëÿ îáúåêòГ* cout
using namespace std;
 
#include<iomanip>
//Ýòîò ГґГ*éë ñîäåðæèò áîëüøóþ Г·Г*Г±ГІГј Г¬Г*Г*èïóëÿòîðîâ C++. Åñëè ГўГ» Г*ГҐ Г§Г*Г*ГҐГІГҐ, Г·ГІГ® ГІГ*êîå Г¬Г*Г*èïóëÿòîð, Г*ГҐ áåñïîêîéòåñü. Ïðîñòî ïîäêëþ÷èòå ГЅГІГ® ГґГ*éë âìåñòå Г± iostream, õóæå Г*ГҐ Г±ГІГ*Г*ГҐГІ.
#include<fstream> 
//Ïîäêëþ÷Г*ГҐГІГ±Гї ïðè Г°Г*áîòå Г± ГґГ*éëГ*ìè.
 
   class Cat
        {
     public:
        
        Cat(int initialAge=5); 
        ~Cat();
        int GetAge() const; // ìåòîä äîñòóïГ* const ГґГіГ*êöèÿ äîñòóïГ* ГЄ Г¤Г*Г*Г*ûì-÷ëåГ*Г*Г¬ ГЄГ«Г*Г±Г±Г* ГЎГҐГ§ ГЇГ°Г*ГўГ* ГЁГµ èçìåГ*ГҐГ*ГЁГї
        void SetAge (int age);
        void Meow();
        void Wydam()  {Bam();};   //Г±ГІГ*ГІГЁГ·ГҐГ±ГЄГЁГ© ìåòîä
        int Bgsamm();
        void Metod(int);
      private:
        int itsAge; // Г±ГІГ*ГІГЁГ·ГҐГ±ГЄГЁГҐ ïåðåìåГ*Г*ûå ГЄГ«Г*Г±Г±Г* (ÑòГ*òè÷åñêîå ïîëå)
        int B;
       
       public: 
    //  Cat(){itsAge=0; B=8;};
        void Bam( ){cout << "Wydam\n";
                                  int BG=itsAge+ B;
                                  cout << BG;   } 
        
        };
                                          
 // ГЄГ®Г*ñòðóêòîð ГЄГ«Г*Г±Г±Г* Cat
  Cat::Cat(int initialAge)
   {
   itsAge = initialAge;
   cout << "Cat constructor\n";
   }
 
  Cat::~Cat() // äåñòðóêòîð, êîòîðûé Г*ГҐ âûïîëГ*ГїГҐГІ Г*ГЁГЄГ*ГЄГЁГµ äåéñòâèé
  {
  cout << "Cat destructor\n";
  }
 
 
 
 int Cat::Bgsamm() 
 {
  return (itsAge++); 
 }
 
 
 
 
 // îïðåäåëåГ*ГЁГҐ ГґГіГ*êöèè SetAge ГЄГ*ГЄ îòêðûòîãî
 // ìåòîäГ* äîñòóïГ* ГЄ Г¤Г*Г*Г*ûì ГЄГ«Г*Г±Г±Г*
 void Cat::SetAge(int age)
 {
    // ïðèñâГ*ГЁГўГ*ГҐГ¬ ïåðåìåГ*Г*îé-÷ëåГ*Гі itsAge
    // Г§Г*Г*Г·ГҐГ*ГЁГҐ ïåðåäГ*Г*Г*îãî ГЇГ*ðéìåòðГ* age
  itsAge = age;
 }
 
     int Cat::GetAge() const
      {
       return itsAge;
      }
 
 
 
      // ÎïðåäåëåГ*ГЁГҐ ìåòîäГ* Meow
      // âîçâðГ*Г№Г*ГҐГІ void
      // ГЇГ*Г°Г*ìåòðîâ Г*ГҐГІ
      // èñïîëüçóåòñÿ äëÿ âûâîäГ* Г*Г* ГЅГЄГ°Г*Г* ГІГҐГЄГ±ГІГ* "Meow"
  void Cat::Meow()
  {
  cout << "Meow.\n";
  }
 
 
 
  Cat obyekt;
  void Cat::Metod (int tselaya=100) //îáû÷Г*ûé ìåòîä
  {tselaya=tselaya+GetAge(); cout << tselaya;cout << "  Г¶ГҐГ«Г*Гї\n";}    
 
 int main()
 {
     Cat b; 
     b.Meow();
    
     cout << b.GetAge();
     b.Bgsamm();
     b.Wydam();
     b.Bam();
     b.Metod();
     system("pause");
    return 0;
 }

Учись оформлять код нормально, невозможно читать такой набор символов
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
11.09.2013, 20:22  [ТС]     Действие конструктора вобще не понял #13
Спасибо!!!

Добавлено через 2 часа 27 минут
Интересно. Совершено понятно, что компилятор заругался на строку 100- функция использует приватную переменную. А вот на строку 99 obyekt.Wydam(); не заругался, а void Wydam() {Bam();}; Использует этот самый Bam()!!!


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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <iostream> // для объекта cout
using namespace std;
 
#include<iomanip>
//Этот файл содержит большую часть манипуляторов C++. Если вы не знаете, что такое манипулятор, не беспокойтесь. Просто подключите это файл вместе с iostream, хуже не станет.
#include<fstream> 
//Подключается при работе с файлами.
 
 
   class Cat
{
     public:
        Cat(int initialAge=5); 
        ~Cat();
        int GetAge() const; // метод доступа const функция доступа к данным-членам класса без права их изменения
        void SetAge (int age);
        void Meow();
        void Wydam()  {Bam();};   //статический метод
        int Bgsamm();
        void Metod(int);
      private:
        int itsAge; // статические переменные класса (Статическое поле)
        int B;
        //  Cat(){itsAge=0; B=8;};
        void Bam( ){cout << "Wydam\n";
                    int BG=itsAge+ B;
                    cout << BG; 
                   } 
        
};
  
 
 
 
 // конструктор класса Cat
  Cat::Cat(int initialAge)
             {
               itsAge = initialAge;
               cout << "Cat constructor\n";
             }
 
   Cat::~Cat() // деструктор, который не выполняет никаких действий
                 {
                   cout << "Cat destructor\n";
                 }
 
 
 
 int Cat::Bgsamm() 
 {
  return (itsAge++); 
 }
 
 
 
 
                                 // определение функции SetAge как открытого
                                 // метода доступа к данным класса
      void Cat::SetAge(int age)  // присваиваем переменной-члену itsAge
      {
                    itsAge = age;// значение переданного парйметра age
      }
 
 
 
 
     int Cat::GetAge()const
      {
       return itsAge;
      }
 
 
 
                           // Определение метода Meow
                           // возвращает void
                           // параметров нет
                           // используется для вывода на экран текста "Meow"
            void Cat::Meow()
             {
              cout << "Meow.\n";
             }
 
 
 
    Cat obyekt;
                  void Cat::Metod (int tselaya=100) //обычный метод
                  {tselaya=tselaya+GetAge(); cout << tselaya;cout << "  целая\n";}    
 
 
 
 int main()
 {
     Cat Frisky; 
     Frisky.Meow();
    
     cout << obyekt.GetAge();
     obyekt.Bgsamm();
     obyekt.Wydam();
     obyekt. Bam();
     obyekt.Metod();
     system("pause");
    return 0;
 }
1>d:\проги\resheniecathapi8pi\cathapi8pi\cathapi8pi.cpp(100): error C2248: Cat::Bam: невозможно обратиться к private член, объявленному в классе "Cat"
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
11.09.2013, 20:41  [ТС]     Действие конструктора вобще не понял #14
Закомментировал строку сто. Мявкает, выдает!
Миниатюры
Действие конструктора вобще не понял  
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
11.09.2013, 20:50  [ТС]     Действие конструктора вобще не понял #15
Почему он пишет Cat constructor дважды???????

Добавлено через 6 минут
А где же "Cat destructor\n";??
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
11.09.2013, 21:05     Действие конструктора вобще не понял #16
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
А где же "Cat destructor\n";??
могу предположить, что деструктор вызывается сразу же после return 0; (в функции main).
и после этого программа сразу же закрывается, и результат "Cat destructor" просто не успеваешь рассмотреть

Добавлено через 2 минуты
что бы увидеть эту строчку, заверните этот кусочек программы в дополнительные фигурные скобки


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 int main()
 {
    {
         Cat Frisky; 
         Frisky.Meow();
        
         cout << obyekt.GetAge();
         obyekt.Bgsamm();
         obyekt.Wydam();
         obyekt. Bam();
         obyekt.Metod();
     }  // здесь вызовется деструктор объекта
     
     system("pause");
    return 0;
 }
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
11.09.2013, 21:17  [ТС]     Действие конструктора вобще не понял #17
Спасибо!!
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
11.09.2013, 21:23     Действие конструктора вобще не понял #18
Пожалуйста )
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
11.09.2013, 22:44  [ТС]     Действие конструктора вобще не понял #19
Да!!!!!

Добавлено через 1 час 5 минут
Удивительно и непонятно, что
C++
1
2
3
 Cat obyekt;
                  void Cat::Metod (int tselaya=100) //обычный метод
                  {tselaya=tselaya+GetAge(); cout << tselaya;cout << "  целая\n";}
выдает 6109 !!!!!!! Тогда как GetAge() выдает 5.Как и должно , собствено.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2013, 10:13     Действие конструктора вобще не понял
Еще ссылки по теме:

C++ Правильно ли я понял условие ?
C++ Функция в обьекте-можно ли создать?Нужно ли?Что я вобще делаю?И как правильно?
объясните задачу, ничего не понял C++

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

Или воспользуйтесь поиском по форуму:
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5437 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
12.09.2013, 10:13     Действие конструктора вобще не понял #20
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
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <iostream>
 
using namespace std;
 
 
class Cat
{
public:
  Cat( int initialAge = 5 );
  ~Cat();
  int GetAge() const;
  void SetAge( int age );
  void Meow();
  int Bgsamm();
  void Metod( int );
private:
  int itsAge;
};
 
Cat::Cat(int initialAge)
  {
  itsAge = initialAge;
  cout << "Completed construction of a Cat" << endl;
  }
 
Cat::~Cat()
  {
  cout << "Cat destroyed. To death" << endl;
  }
 
int Cat::Bgsamm()      // Метод дня рождения?
  {
  return (itsAge++);
  }
 
void Cat::SetAge( int age )
  {
  itsAge = age;
  }
 
int Cat::GetAge()const
  {
  return itsAge;
  }
 
void Cat::Meow()
  {
  cout << "Meow." << endl;
  }
 
void Cat::Metod( int tselaya = 100 ) //// Метод выводит возраст кота
  {                                    //   с прибавкой по умолчанию ста лет (за каким-то чертом)
  tselaya = tselaya + GetAge();        //   (из раздела сколько бы было
  cout << tselaya << endl;             //      ему лет, через сто лет)
  }                                  ////    При чем сам возраст от этого не изменится
 
Cat obyekt; // Какой-то глобальный кот
 
int main()
{
  {
  Cat Frisky; // Кот, живущий только в main-е. (рождается по умолчанию пятилетним)
  Cat Barsik(666); // Барсик сразу рождается шестьсот шестьдесят шестидесяти летним
 
  Frisky.Meow(); // Фриски мяукает
  Barsik.Meow(); // Барсик мяукает
  obyekt.Meow(); // Объект мяукает
 
  cout << "obyekt age: " << obyekt.GetAge() << endl;; // Получить и вывести на экран возраст объекта
  int BarsikAge = Barsik.GetAge();                    // Получить и запомнить возраст Барсика (просто так)
 
  obyekt.Bgsamm(); // Состарить объект на один год
  Barsik.Bgsamm(); // День рождения Барсика
 
  cout << "obyekt age: " << obyekt.GetAge() << endl;; // Вывести текущий
  cout << "Barsik age: " << Barsik.GetAge() << endl;; //     возраст обоих
 
  Barsik.SetAge(1000);                               // Состарить Барсика до тысячелетнего возраста
  cout << "Barsik age: " << Barsik.GetAge() << endl; // Отобразить это
 
  obyekt.Metod();    // Выведет возраст объекта + 100
  Barsik.Metod(999); // Выведет возраст Барсика + 999
  }
 
system("pause");
 
bool DogEaster = false;
while(!DogEaster)       // Заставить объект мяукать
  obyekt.Meow();        //       до собачьей пасхи
 
return 0;
}
Вот. С вас пол часа моей жизни.


Цитата Сообщение от ___ Посмотреть сообщение
могу предположить, что деструктор вызывается сразу же после return 0; (в функции main).
и после этого программа сразу же закрывается, и результат "Cat destructor" просто не успеваешь рассмотреть
Угу. А у Объекта вообще деструктор вызовется только по завершению окна консоли.
Yandex
Объявления
12.09.2013, 10:13     Действие конструктора вобще не понял
Ответ Создать тему
Опции темы

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