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

#include <iostream>

using namespace std;

class myclass {

  int a;

 public:

  explicit myclass(int x) { a = x; }

  int geta() { return a; }

};

Теперь будут разрешены к применению только конструкторы, заданные в таком формате.

myclass ob(110);

Чем интересно неявное преобразование конструктора

Автоматическое преобразование из типа аргумента конструктора в вызов конструктора само по себе имеет интересные последствия. Рассмотрим, например, следующий код.

#include <iostream>

using namespace std;

class myclass {

  int num;

 public:

  myclass(int i) { num = i; }

  int getnum() { return num; }

};

int main()

{

 myclass о(10);

 cout << o.getnum() << endl; // отображает 10

 /* Теперь используем неявное преобразование для присвоения нового значения. */

 о = 1000;

 cout << o.getnum() << endl; // отображает 1000

 return 0;

}

Обратите внимание на то, что новое значение присваивается объекту о с помощью такой инструкции:

о = 1000;

Использование данного формата возможно благодаря неявному преобразованию из типа int в тип myclass, которое создается конструктором myclass(). Конечно же, если бы конструктор myclass() был объявлен с помощью спецификатора explicit, то предыдущая инструкция не могла бы выполниться.

Синтаксис инициализации членов класса

В примерах программ из предыдущих глав члены данных получали начальные значения в конструкторах своих классов. Например, следующая программа содержит класс myclass, который включает два члена данных numA и numB. Эти члены инициализируются в конструкторе myclass().

#include <iostream>

using namespace std;

class myclass {

  int numA;

  int numB;

 public:

  /* Инициализируем члены numA и numB в конструкторе myclass(), используя обычный синтаксис. */

  myclass(int х, int у) { numA = х; numA = y;}

  int getNumA() { return numA; }

  int getNumB() { return numB; }

};

int main()

{

 myclass ob1(7, 9), ob2 (5, 2);

 cout << "Значения членов данных объекта ob1 равны " << ob1.getNumB() << " и " << ob1.getNumA() << endl;

 cout << "Значения членов данных объекта ob2 равны " << ob2.getNumB() << " и " << ob2.getNumA() << endl;

 return 0;

}

Результаты выполнения этой программы таковы.

Значения членов данных объекта ob1 равны 9 и 7

Значения членов данных объекта ob2 равны 2 и 5

Присвоение начальных значений членам данных numA и numB в конструкторе, как это делается в конструкторе myclass(), — обычная практика, которая применяется для многих классов. Но этот метод годится не для всех случаев. Например, если бы члены numA и numB были заданы как const-переменные, т.е. таким образом:

class myclass {

 const int numA; // const-член

 const int numB; // const-член