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

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

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

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

11.09.2013, 13:35. Просмотров 767. Ответов 22
Метки нет (Все метки)

Вобще не понял, зачем нужен конструктор.
Ведь написано Как же инициализировать переменные-члены класса? Для этого в классе используется специальная функция-член, называемая конструктором.

Я думал, конструктор нужен только потому, что в классе нельзя написать просто 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: необъявленный идентификатор
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2013, 13:35     Действие конструктора вобще не понял
Посмотрите здесь:

Не понял в С++ зачем нужны ссылки в функциях и Перегрузку конструктора! - C++
Мож кто разьяснит в этих темам что и для чего они нужны!обяз с примерами!

Функция в обьекте-можно ли создать?Нужно ли?Что я вобще делаю?И как правильно? - C++
Простите еще и за русские буквы... Cat::объект; объект void Метод (int целая=100;) //обычный метод {целая=целая+initialAge;...

При работе с символами адрес вместо адреса иероглифы, а с символьными массивами вобще ошибки. - C++
/* 1) int a; int *b=&amp;a; cout&lt;&lt;b&lt;&lt;endl; 2) char a; char *b=&amp;a; cout&lt;&lt;b; */ Надо просто...

Не понял ошибку - C++
#include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; int main(int argc, char* argv) { float...

не понял. битовые поля - C++
Опишите битовое поле для хранения следующей информации (размер задавать по минимуму): u номер группы (6 цифр); u ...

Правильно ли я понял условие ? - C++
1) Нахожу обратную матрицу для очередной матрицы 2) Сравниваю полученную обратную матрицу с последующими матрицами 3) Если есть...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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.Как и должно , собствено.
SatanaXIII
Супер-модератор
Эксперт С++
5603 / 2637 / 242
Регистрация: 01.11.2011
Сообщений: 6,496
Завершенные тесты: 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" просто не успеваешь рассмотреть
Угу. А у Объекта вообще деструктор вызовется только по завершению окна консоли.
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
12.09.2013, 10:20     Действие конструктора вобще не понял #21
Цитата Сообщение от SatanaXIII Посмотреть сообщение
А у Объекта вообще деструктор вызовется только по завершению окна консоли.
а если локальный объект расположенный в main()? мне кажется что деструктор будет вызван где-то после return 0; и закрывающей скобкой

C++
1
2
3
4
5
6
7
int main()
{
    Cat Frisky; // Кот, живущий только в main-е
 
    return 0;
                // <-- где-то в этом месте должен быть вызван деструктор для Cat
}               // <-- а может быть и здесь
конечно, если объект глобальный, то он будет жить еще дольше, чем локальный
SatanaXIII
Супер-модератор
Эксперт С++
5603 / 2637 / 242
Регистрация: 01.11.2011
Сообщений: 6,496
Завершенные тесты: 1
12.09.2013, 10:30     Действие конструктора вобще не понял #22
Цитата Сообщение от ___ Посмотреть сообщение
<-- а может быть и здесь
Для локального скорее всего здесь.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2013, 14:45     Действие конструктора вобще не понял
Еще ссылки по теме:

Указатели: правильно ли я понял вопрос? - C++
Есть задание Я написал такой код: #include&lt;iostream&gt; using namespace std; #include&lt;windows&gt; int main() {

Немного не понял описание классов - C++
#pragma once #include &lt;QWidget&gt; #include &lt;QSettings&gt; class QComboBox; class QCheckBox; class QTextEdit; class...

Разбираю списки .Правильно ли понял ? - C++
А если нет - укажите где ошибки у меня . и 1) Правильный ли код с точки зрения понимания ? 2) Как бы выглядела более...

Правильно ли я понял объявления указателей - C++
Делая задания по самоучителю, как то нужно проверять себя. Кроме вас некому )) Задание состоит в том - нужно объявить новый тип. Если...


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

Или воспользуйтесь поиском по форуму:
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
12.09.2013, 14:45  [ТС]     Действие конструктора вобще не понял #23
Спасибо!!!!!!! Ржу до слез. Спасибо за пример редактирования кода!!! Я сам его десять раз сдвигал- передвигал отступы, скобки вза- перед, но все равно получалось ужасно..

Добавлено через 1 час 25 минут
Все работает.
Yandex
Объявления
12.09.2013, 14:45     Действие конструктора вобще не понял
Ответ Создать тему
Опции темы

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