Выбрать главу

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

#include <iostream>

using namespace std;

class widget {

  int i;

  int j;

 public:

  widget(int a, int b);

  void put_widget();

};

// Передаем 2 аргумента конструктору widget().

widget::widget(int a, int b)

{

 i = a; j = b;

}

void widget::put_widget()

{

 cout << i << " " << j << "\n";

}

int main()

{

 widget x(10, 20), y(0, 0);

 x.put_widget();

 у.put_widget();

 return 0;

}

Важно! В отличие от конструкторов, деструкторы не могут иметь параметров. Причину понять нетрудно: не существует средств передачи аргументов объекту, который разрушается. Если же у вас возникнет та редкая ситуация, когда при вызове деструктора вашему объекту необходимо получить доступ к некоторым данным, определяемым только во время выполнения программы, создайте для этой цели специальную переменную. Затем непосредственно перед разрушением объекта установите эту переменную равной нужному значению.

При выполнении эта программа отображает следующие результаты.

10 20

0 0

Альтернативный вариант инициализации объекта

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

#include <iostream>

using namespace std;

class myclass {

  int a;

 public:

  myclass(int x);

  int get_a();

};

myclass::myclass(int x)

{

 a = x;

}

int myclass::get_a()

{

 return a;

}

int main()

{

 myclass ob = 4; // вызов функции myclass(4)

 cout << ob.get_a();

 return 0;

}

Здесь конструктор для объектов класса myclass принимает только один параметр. Обратите внимание на то, как в функции main() объявляется объект ob. Для этого используется такой формат объявления:

myclass ob = 4;

В этой форме инициализации объекта число 4 автоматически передается параметру х при вызове конструктора myclass(). Другими словами, эта инструкция объявления обрабатывается компилятором так, как если бы она была записана следующим образом.

myclass ob = myclass(4);

В общем случае, если у вас есть конструктор, который принимает только один аргумент, для инициализации объекта вы можете использовать либо вариант ob(х), либо вариант ob=х. Дело в том, что при создании конструктора с одним аргументом неявно создается преобразование из типа этого аргумента в тип этого класса.

Помните, что показанный здесь альтернативный способ инициализации объектов применяется только к конструкторам, которые имеют только один параметр.

Классы и структуры — родственные типы

Как упоминалось в предыдущей главе, в C++ структура также обладает объектно-ориентированными возможностями. В сущности, классы и структуры можно назвать близкими родственниками. За одним исключением, они взаимозаменяемы, поскольку структура также может включать данные и код, который манипулирует этими данными точно так же, как это может делать класс. Единственное различие между С++-структурой и С++-классом состоит в том, что по умолчанию члены класса являются закрытыми, а члены структуры — открытыми. В остальном же структуры и классы имеют одинаковое назначение. На самом деле в соответствии с формальным синтаксисом C++ объявление структуры создает тип класса.