Читаем Освой самостоятельно С++ за 21 день. полностью

В листингах 10.1 и 10.2 выполняются одни и те же задачи, но использование перегруженных функций в листинге 10.1 делает программу более естественной и читабельной. Кроме того, если в программе потребуется третий вариант функции, например, для того, чтобы пользователь мог задать только один размер геометрической фигуры, а другой оставить по умолчанию, не составит труда добавить новую перегруженную функцию.

Как решить, что следует использовать в программе — перегруженные функции или значения по умолчанию? Примите к сведению следующие положения. Использование перегруженных функций предпочтительнее, если:

• не существует стандартных общепринятых значений, которые можно было бы использовать по умолчанию;

• в программе в зависимости от ситуации необходимо использовать различные алгоритмы;

• необходимо иметь возможность изменять тип значений, передаваемых в функцию.

Конструктор, принятый по умолчанию

На шестом занятии, изучая базовые классы, вы узнали, что в случае отсутствия явного объявления конструктора класса используется конструктор по умолчанию, который не содержит параметров и никак себя не проявляет в программе. Не составляет труда создать собственный конструктор, применяемый по умолчанию, который также не будет принимать никаких параметров, но позволит управлять созданием объектов класса.

Конструктор, предоставляемый компилятором, называется заданным по умолчанию. В то же время конструктором по умолчанию называется также любой другой конструктор класса, не содержащий параметров. Это может показаться странным, но ситуация прояснится, если посмотреть на дело с точки зрения применения данного конструктора на практике.

Примите к сведению, что если в программе был создан какой-либо конструктор, то компилятор не будет предлагать свой конструктор по умолчанию. Поэтому, если вам нужен конструктор без параметров, а в программе уже создан один конструктор, то конструктор по умолчанию нужно будет создать самостоятельно!

Перегрузка конструкторов

Конструктор предназначен для создания объекта. Например, назначение конструктора Rectangle состоит в создании объекта прямоугольник. До запуска конструктора прямоугольник в программе отсутствует. Существует только зарезервированная для него область памяти. По завершении выполнения конструктора в программе появляется готовый для использования объект.

Конструкторы, как и все другие функции, можно перегружать. Перегрузка конструкторов — мощное средство повышения эффективности и гибкости программы.

Например, рассматриваемый нами объект Rectangle может иметь два конструктора. В первом задается ширина и длина прямоугольника, а второй не имеет параметров и для установки размеров использует значения по умолчанию. Эта идея реализована в листинге 10.3.

Листинг 10.3. Перегрузка канструктора  

1: // Листинг 10.3.

2: // Перегрузка конструктора

3:

4: #include

5:

6: class Rectangle

7: {

8:    public:

9:       Rectangle;

10:      Rectangle(int width, int length);

11:      ~Rectangle { }

12:      int GetWidth const { return itsWidth; }

13:      int GetLength const { return itsLength; }

14:   private:

15:      int itsWidth;

16:      int itsLength;

17: };

18:

19: Rectangle::Rectangle

20: {

21:    itsWidth = 5;

22:    itsLength = 10;

23: }

24:

25: Rectangle::Rectangle (int width, int length)

26: {

27:    itsWidth = width;

28:    itsLength = length;

29: }

30:

31: int main

32: {

33:    Rectangle Rect1;

34:    cout << "Rect1 width: " << Rect1.GetWidth << endl;

35:    cout << "Rect1 length: " << Rect1.GetLength << endl;

36:

37:    int aWidth, aLength;

38:    cout << "Enter a width: ";

39:    cin >> aWidth;

40:    cout << "\nEnter a length: ";

41:    cin >> aLength;

42:

43:    Rectangle Rect2(aWidth, aLength);

44:    cout << "\nRect2 width: " << Rect2.GetWidth << endl;

45:    cout << "Rect2 length: " << Rect2.GetLength << endl;

46:    return 0;

47: }


Результат:

Rect1 width: 5

Rect1 length: 10

Enter a width: 20

Enter a length: 50

Rect2 width: 20

Rect2 length: 50


Анализ: Класс Rectangle объявляется в строках с 6 по 17. В классе представлены два конструктора: один использует значения по умолчанию (строка 9), а второй принимает значения двух целочисленных параметров (строка 10). В строке 33 прямоугольный объект создается с использованием первого конструктора. Значения размеров прямоугольника, принятые по умолчанию, выводятся на экран в строках 34 и 35. Строки программы с 37 по 41 выводят на экран предложения пользователю ввести собственные значения ширины и длины прямоугольника. В строке 43 вызывается второй конструктор, использующий два параметра с только что установленными значениями. И наконец, значения размеров прямоугольника, установленные пользователем, выводятся на экран в строках 44 и 45.

Как и при использовании других перегруженных функций, компилятор выбирает нужное объявление конструктора, основываясь на числе и типе параметров.

Инициализация объектов

Перейти на страницу:

Похожие книги

Сущность технологии СОМ. Библиотека программиста
Сущность технологии СОМ. Библиотека программиста

В этой книге СОМ исследуется с точки зрения разработчика C++. Написанная ведущим специалистом по модели компонентных объектов СОМ, она раскрывает сущность СОМ, помогая разработчикам правильно понять не только методы модели программирования СОМ, но и ее основу. Понимание мотивов создания СОМ и ее аспектов, касающихся распределенных систем, чрезвычайно важно для тех разработчиков, которые желают пойти дальше простейших приложений СОМ и стать по-настоящему эффективными СОМ-программистами. Показывая, почему СОМ для распределенных систем (Distributed СОМ) работает именно так, а не иначе, Дон Бокс дает вам возможность применять эту модель творчески и эффективно для ежедневных задач программирования.

Дональд Бокс

Программирование, программы, базы данных / Программирование / Книги по IT