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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.79
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
27.08.2013, 23:23     Что делает конструктор? #1
Я очень плохо понял вобще. Он вроде помогает создать в памяти место для переменных обьявленых в классе??
В каких слуаях его лучше создавать и использовать?Его лучше иметь для каждого класса?

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

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

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++
C++ Что это за метод?И что он делает?
C++ Что делает строка?
C++ что делает tellg?
Объясните что именно делает "x%d, y%d: " или что это в даном коде C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.08.2013, 23:36     Что делает конструктор? #2
Зачем нужен конструктор?
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
27.08.2013, 23:45  [ТС]     Что делает конструктор? #3
Спасибо!! Гораздо более понятно. А то либерти как-то так подает информацию- риально больше путает. Рвано, как-то до непонятки укорочено.
alsav22
28.08.2013, 00:08
  #4

Не по теме:

Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
А то либерти как-то так подает информацию- риально больше путает.
Либерти - в топку...

Croessmah
28.08.2013, 02:38
  #5

Не по теме:

alsav22, кстати, Вы заметили, что большинство непоняток вызывают именно моменты из книги Либерти?

alsav22
28.08.2013, 02:53
  #6

Не по теме:

Интересный эффект: мне её захотелось прочитать...

Croessmah
28.08.2013, 03:00
  #7

Не по теме:

Цитата Сообщение от alsav22 Посмотреть сообщение
Интересный эффект: мне её захотелось прочитать...
Я только до половины осилил

reisal78
 Аватар для reisal78
603 / 516 / 119
Регистрация: 28.04.2013
Сообщений: 1,451
28.08.2013, 08:53     Что делает конструктор? #8
Лафоре, ООП, глава 5 Классы

Как правило, удобнее инициализировать поля объекта автоматически в момент его создания, а не явно вызывать в программе соответствующий метод. Такой способ инициализации реализуется с помощью особого метода класса, называемого конструктором. Конструктор – это метод класса, выполняющийся автоматически в момент создания объекта.
Пример со счетчиком
В качестве примера мы создадим класс, объекты которого могут быть полезны практически для любой программы. Счетчик – это средства, предназначенное для хранения количественной меры какой-либо изменяющейся величины. Счетчик может хранить число обращений к файлу, число раз, которое пользователь нажал клавишу Enter, или количество клиентов банка. Как правило, при наступлении соответствующего события счетчик увеличивается на единицу (инкрементируется). Обращение к счетчику происходит, как правило, для того, чтобы узнать текущее значение той величины, для измерения которой он предназначен.
Допустим, что счетчик, который мы сейчас создадим, будет важной частью нашей программы, и многие из ее функций будут использовать значение этого счетчика. В процедурных языках, таких, как С, счетчик, скорее всего, был бы представлен в вмде глобальной переменной. Но, как мы уже говорили в главе 1, использование глобальных переменных усложняет разработку программы и небезопасно с точки зрения несанкционированного доступа со стороны функций. Наш следующий пример, COUNTER, использует токай счетчик, значение которого может быть изменено только с помощью его собственных методов.
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
// counter.cpp
// счетчик в качестве объекта
#include <iostream>
using namespace std;
//////////////////////////////////////////////////////////
class Counter
{
  private:
    unsigned int count;         // значение счетчика
  public:
    Counter() : count(0)        // конструктор
      { /* пустое тело */ }
    void inc_count()            // инкрементирование счетчика
      { count++; }
    int get_count()             // получение значения счетчика
      { return count; }
};
//////////////////////////////////////////////////////////
int main()
{
  Counter c1, c2;               // определение с инициализацией
  cout <<"\nc1=" << c1.get_count(); // вывод
  cout <<"\nc2=" << c2.get_count();
  c1.inc_count();               // инкрементирование c1
  c2.inc_count();               // инкрементирование c2
  c2.inc_count();               // инкрементирование c2
  cout <<"\nc1=" << c1.get_count(); // вывод
  cout <<"\nc2=" << c2.get_count(); 
  cout << endl;
  return 0;
}
Класс Counter имеет единственное поле count типа unsigned int, поскольку значение счетчика не может быть отрицательным, и три метода: конструктор Counter(), который мы рассмотрим чуть позже, inc_count(), инкрементирующий поле count, и get_count(), возвращающий текущее значение счетчика.
Автоматическая инициализация
Когда создается объект типа Counter, нам хотелось бы, чтобы его поле count было инициализировано нулевым значением, поскольку большинство счетчиков начинают отсчет именно с нуля. Мы могли бы провести инициализацию с помощью вызова функции set_count() с аргументом, равным нулю, или создать специальный метод zero_count(), обнуляющий значение функции. Недостаток такого подхода заключается в том, что эти функции необходимо вызывать явно каждый раз при создании объекта типа Counter:
C++
1
2
Counter c1;         // При определении объекта
c1.zero_count();        // это необходимое действие
Подобные действия легко могут привести к неправильной работе всей программы, поскольку программисту для этого достаточно забыть проинициализировать хотя бы одну переменную после ее создания. Если в программе создается множество таких переменных, гораздо проще и надежнее было бы инициализировать их автоматически при создании. В нашем примере конструктор Counter() выполняет эти действия. Конструктор вызывается автоматически при создании каждого из объектов. Таким образом, в функции main() оператор
C++
1
Counter c1, c2;
создает два объекта типа Counter. При создании каждого из них вызывается конструктор Counter(), присваивающий полю counter нулевое значение. Таким образом, кроме создания переменных, данный оператор еще присваивает их полям нулевое значение.
Имя конструктора
У конструкторов есть несколько особенностей, отличающих их от других методов класса. Во-первых, имя конструктора в точности совпадает с именем класса (в нашем примере таким именем является Counter). Таким образом, компилятор отличает конструкторы от других методов класса. Во-вторых, у конструкторов не существует возвращаемого значения. Это объясняется тем, что конструктор автоматически вызывается системой, и, следовательно, не существует вызывающей программы или функции, которой конструктор мог бы возвратить значение. Следовательно, указание возвращаемого значения у конструкторов является вторым признаком, по которому компилятор может отличить их от других методов класса.
Список инициализации
Одной из наиболее часто возлагаемых на конструктор задач является инициализация полей объекта класса. Для каждого объекта класса Counter конструктор выполняет инициализацию поля count нулем. Вы, вероятно, ожидали, что это действие будет произведено в теле конструктора приблизительно следующим образом:
C++
1
2
count ()
    { count = 0;}
Такая форма записи не рекомендуется, хотя она и не содержит ошибок. Инициализация в нашем примере происходит следующим образом:
C++
1
2
Counter() : count(0) 
{ }
Инициализация расположена между прототипом метод и телом функции и предварена двоеточием. Инициализирующее значение помещено в скобках после имени поля.
Если необходимо инициализировать сразу несколько полей класса, то значения разделяются запятыми, и в результате образуется список инициализации:
C++
1
2
someClass : m1(7), m2(33), m3(4) 
{ }
Причины, по которым инициализация не проводится в теле конструктора, достаточно сложны. Инициализация полей с помощью списка инициализации происходит до начала исполнения тела конструктора, что в некоторых ситуациях бывает важно. Так например, список инициализации – это единственный способ задать начальные значения констант и ссылок. В теле конструктора, как правило, производятся более сложные действия, чем обычная инициализация.
Конструкторы и собственные типы данных
Разработчики компиляторов для языков С, VB или C++ должны позаботится о том, чтобы для любой переменной стандартного типа, которую программист определяет в своей программе, вызывался необходимый конструктор. Например, если в программе встречается определение переменной типа int, где-то должен существовать конструктор, который выделит для этой переменной четыре байта памяти. Таким образом, научившись создавать свои собственные конструкторы, мы можем выполнять задачи, с которыми сталкиваются разработчики компиляторов. Мы сделали еще один шаг на пути к созданию собственных типов данных, в чем мы скоро убедимся.
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
28.08.2013, 11:35  [ТС]     Что делает конструктор? #9
Спасибо!!!!!!!
VLK
28.08.2013, 11:41
  #10

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение

Не по теме:

alsav22, кстати, Вы заметили, что большинство непоняток вызывают именно моменты из книги Либерти?

ну все правильно, когда ты не знаешь ни какого программирования, то допустим по книге Дейтел - Как программировать на С++, там вообще ни чего не понимаешь (проверено лично), а вот по книге Либерти, со скрипом но понимаешь, правда не все..

reisal78
28.08.2013, 12:40
  #11

Не по теме:

Я сначала начал читать
Хортон Visual C++ 2010 Полный курс-2011 г
Поначалу пока шли темы известные мне еще со школьных уроков информатики все было довольно понятно, но как добрался до новой для меня темы Указатели - я забуксовал очень трудно было разобраться в теме.
Попутно листая форум, увидел рекомендацию почитать

Р. Лафоре - Объектно ориентированное программирование С++
Мое мнение - отличная книга для начинающего, материал изложен очень доступно и понятно. Ну если конечно, изучать по порядку не пропуская те разделы, которые как тебе кажется, ты уже знаешь. =)

Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
28.08.2013, 19:34  [ТС]     Что делает конструктор? #12
Либерти пишет в общем не так и плохо, но все же очень уж сжато. Много раз пиречитывая, остаются все же копны вопросов, вроде тех, что я спрашивал. Приходится совмищать несколько книг. И форум, конечно же.Но это вобще, всегда так, для любой новой темы, и языков тоже.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
28.08.2013, 19:39     Что делает конструктор? #13
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
Либерти пишет в общем не так и плохо, но все же очень уж сжато. Много раз пиречитывая, остаются все же копны вопросов, вроде тех, что я спрашивал. Приходится совмищать несколько книг. И форум, конечно же.Но это вобще, всегда так, для любой новой темы, и языков тоже.
если сравнить Либерти и Дейтола, у Дейтола очень чмошное начало, т.е. первая глава Hello word, следующая уже классы, в которых присутствую функции которые ты до этого не встречал, а так книга нормально написана, но новичку ее не просто понять.

У Либерти очень хорошее начало, все просто расписано и по мере необходимости, но начиная с середины в Либерти вселяется дьявол, и он начинает мудрить до конца книги.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,868
Записей в блоге: 2
Завершенные тесты: 1
28.08.2013, 19:42     Что делает конструктор? #14
Цитата Сообщение от VLK Посмотреть сообщение
т.е. первая глава Hello word, следующая уже классы
Есть книги, в которых начинают с изучения STL и такой подход весьма эффективен. Если Вы не понимаете, то это не значит что книга плохая.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
28.08.2013, 19:43     Что делает конструктор? #15
Цитата Сообщение от Croessmah Посмотреть сообщение
Если Вы не понимаете, то это не значит что книга плохая.
вот тут как раз большая ошибка, если я не понимаю, а точнее читатель не понимает, это именно и значит что книга плохая.
zer0mail
2185 / 1868 / 187
Регистрация: 03.07.2012
Сообщений: 6,640
Записей в блоге: 1
28.08.2013, 20:16     Что делает конструктор? #16
Цитата Сообщение от VLK Посмотреть сообщение
вот тут как раз большая ошибка, если я не понимаю, а точнее читатель не понимает, это именно и значит что книга плохая.
При условии, что Вы - единственный читатель книги
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
28.08.2013, 20:18     Что делает конструктор? #17
Цитата Сообщение от zer0mail Посмотреть сообщение
При условии, что Вы - единственный читатель книги
без всяких условий.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.08.2013, 20:24     Что делает конструктор? #18
Цитата Сообщение от VLK Посмотреть сообщение
если я не понимаю, а точнее читатель не понимает, это именно и значит что книга плохая.
или вам не хватает йода
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
28.08.2013, 20:41     Что делает конструктор? #19
Цитата Сообщение от Jupiter Посмотреть сообщение
или вам не хватает йода
ни когда не встречал в книгах такого примечания / пункта "если у вас не хватает йода эта книге не для вас!", вот на микроволновках пишут, что в них нельзя сушить кошек, а вот про йода в книгах ни чего..
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2013, 20:48     Что делает конструктор?
Еще ссылки по теме:

Что это за знак >> прочитал что это сдвиг вправо? что он делает C++
C++ Что делает printf?
C++ Что делает операция new?

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.08.2013, 20:48     Что делает конструктор? #20

Не по теме:

Цитата Сообщение от VLK Посмотреть сообщение
ни когда не встречал в книгах такого примечания / пункта "если у вас не хватает йода эта книге не для вас!"
А такое встречали: "Книга - для подготовленного читателя"?
Или: "Книга предназначена для читателей, знакомых с ..."

?
Yandex
Объявления
28.08.2013, 20:48     Что делает конструктор?
Ответ Создать тему
Опции темы

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