/* Инициализируем члены 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-член

};

то им нельзя было бы присвоить значения с помощью конструктора класса myclass, поскольку const-переменные должны быть инициализированы однократно, после чего им уже нельзя придать другие значения. Подобные проблемы возникают при использовании ссылочных членов, которые должны быть инициализированы, и при использовании членов класса, которые не имеют конструкторов по умолчанию. Для решения проблем такого рода в C++ предусмотрена поддержка альтернативного синтаксиса инициализации членов класса, который позволяет присваивать им начальные значения при создании объекта класса.

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

constructor(список_аргументов):

 член1(инициализатор),

 член2(инициализатор),

 // ...

 членN (инициализатор)

{

 // тело конструктора

}

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

Ниже представлена предыдущая программа, но переделанная так, чтобы члены numA и numB были объявлены с использованием модификатора const, и получали свои начальные значения с помощью альтернативного синтаксиса инициализации членов класса.

#include

using namespace std;

class myclass {

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

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

 public:

  /* Инициализируем члены numA и numB с использованием альтернативного синтаксиса инициализации. */

  myclass(int х, int у) : numA(x), numB(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;

}

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

myclass(int х, int у) : numA(x), numB(у) { }

Здесь член numA инициализируется значением, переданным в аргументе х, а член numB — значением, переданным в аргументе у. И хотя члены numA и numB сейчас определены как const-переменные, они могут получить свои начальные значения при создании объекта класса myclass, поскольку здесь используется альтернативный синтаксис инициализации членов класса.

Использование ключевого слова asm
Перейти на страницу:

Все книги серии Изучайте C++ с профессионалами

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