С++ для начинающих



         

Конструктор класса - часть 5


inline Account::

Account( const char* name, double opening_bal )

       : _balance( opening_bal )

{

      _name = new char[ strlen(name)+1 ];

      strcpy( _name, name );

      _acct_nmbr = get_unique_acct_nmbr();

}

get_unique_acct_nmbr() – это не являющаяся открытой функция-член, которая возвращает гарантированно не использованный ранее номер счета.

Конструктор нельзя объявлять с ключевыми словами const или volatile (см. раздел 13.3.5), поэтому приведенные записи неверны:

class Account {

public:

   Account() const;     // ошибка

   Account() volatile;  // ошибка

   // ...

};

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

Рассмотрим следующий фрагмент программы:

// в каком-то заголовочном файле

extern void print( const Account &acct );

// ...

int main()

{

   // преобразует строку "oops" в объект класса Account

   // с помощью конструктора Account::Account( "oops", 0.0 )

   print( "oops" );

   // ...

}

По умолчанию конструктор с одним параметром (или с несколькими – при условии, что все параметры, кроме первого, имеют значения по умолчанию) играет роль оператора преобразования. В этом фрагменте программы конструктор Account неявно применяется компилятором для трансформации литеральной строки в объект класса Account при вызове print(), хотя в данной ситуации такое преобразование не нужно.

Непреднамеренные неявные преобразования классов, например трансформация "oops" в объект класса Account, оказались источником трудно обнаруживаемых ошибок. Поэтому в стандарт C++ было добавлено ключевое слово explicit, говорящее компилятору, что такие преобразования не нужны:

class Account {

public:

   explicit Account( const char*, double=0.0 );

};

Данный модификатор применим только к конструктору. (Операторы преобразования и слово explicit обсуждаются в разделе 15.9.2.)




Содержание  Назад  Вперед