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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Библиотеки для книги Страуструпа http://www.cyberforum.ru/cpp-beginners/thread944613.html
Доброго времени суток! Дядя Бьярне использует библиотеки в своей книге "Принципы и практика использования С++", которых нет в компиляторах. Причем при добавлении их в папку include их дальнейшее использование почему-то невозможно. К примеру: при вызове библиотеки graph.h, предварительно добавленной в выше упомянутую папку, компиляторы dev, code::blocks, ms vc++ выдают ошибку. Подскажите как...
C++ Системы счисления Помогите дописать функцию перевода дробной части числа. Заранее благодарен. Код программы: #include <iostream> #include <conio.h> #include <locale.h> char int_symbol(int num){ char out={'0','1','2','3','4','5','6','7','8','9', http://www.cyberforum.ru/cpp-beginners/thread944605.html
C++ "Жизнь" на C++
Решил написать консольную версию популярной игры "Жизнь"(http://ru.wikipedia.org/wiki/%D0%96%D0%B8%D0%B7%D0%BD%D1%8C_(%D0%B8%D0%B3%D1%80%D0%B0)) field.h: class field{ // игровое поле. unsigned char f; public: field();// пустое поле field(const field& c); void set_living_cell(int str,int column);// задать живую клетку. void print();// вывод поля
Запрет ввода букв C++
Вчера пробовал написать калькулятор. Но в нем можно вводить и буквы и цифры. Что надо допасать в коде чтобы буквы не вводились на экран? А вводились только цифры. При вводе букв получаеться вот такое http://firepic.org/images/2013-08/27/iapso64br2t6.jpg
C++ Ошибка: Multiples types in one declaration http://www.cyberforum.ru/cpp-beginners/thread944534.html
Как исправить ошибку которая ниже на скрине? И заработает ли этот код?( проба создать связной список) #include <iostream> using namespace std; class part { public: part(){i=10;} part(int item){i=item;} ~part(){}
C++ Как вшить библиотеку MSVCP100.dll в программу? Добрый день. Написал программу и у меня она работает на отлично, однако у знакомых она требует библиотеку MSVCP100.dll. Вариант скачать ее просто так не устраивает, ибо каждому, кто будет пользоваться программой, качать библиотеку фиговое решение. Как можно вшить MSVCP100.dll в программу? MVS 2010 C++. подробнее

Показать сообщение отдельно
reisal78
 Аватар для reisal78
603 / 516 / 119
Регистрация: 28.04.2013
Сообщений: 1,451
28.08.2013, 08:53     Что делает конструктор?
Лафоре, ООП, глава 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, где-то должен существовать конструктор, который выделит для этой переменной четыре байта памяти. Таким образом, научившись создавать свои собственные конструкторы, мы можем выполнять задачи, с которыми сталкиваются разработчики компиляторов. Мы сделали еще один шаг на пути к созданию собственных типов данных, в чем мы скоро убедимся.
 
Текущее время: 19:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru