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



         

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


Нужно ли поддерживать также задание одного лишь начального баланса без указания имени клиента? В данном случае спецификация класса явно запрещает это. Наш конструктор с двумя параметрами, из которых второй имеет значение по умолчанию, предоставляет полный интерфейс для указания начальных значений тех членов класса Account, которые могут быть инициализированы пользователем:

class Account {

public:

   // конструктор по умолчанию ...

   Account();

   // имена параметров в объявлении указывать необязательно

   Account( const char*, double=0.0 );

   const char* name() { return name; }

   // ...

private:

   // ...

};

Ниже приведены два примера правильного определения объекта класса Account, где конструктору передается один или два аргумента:

int main()

{

   // правильно: в обоих случаях вызывается конструктор

   // с двумя параметрами

   Account acct( "Ethan Stern" );

   Account *pact = new Account( "Michael Lieberman", 5000 );

   if ( strcmp( acct.name(), pact->name() ))

      // ...

}

C++ требует, чтобы конструктор применялся к определенному объекту до его первого использования. Это означает, что как для acct, так и для объекта, на который указывает pact, конструктор будет вызван перед проверкой в инструкции if.

Компилятор перестраивает нашу программу, вставляя вызовы конструкторов. Вот как, по всей вероятности, будет модифицировано определение acct внутри main():

// псевдокод на C++,

// иллюстрирующий внутреннюю вставку конструктора

int main()

{

   Account acct;

   acct.Account::Account("Ethan Stern", 0.0);

   // ...

}

Конечно, если конструктор определен как встроенный, то он подставляется в точке вызова.

Обработка оператора new несколько сложнее. Конструктор вызывается только тогда, когда он успешно выделил память. Модификация определения pact в несколько упрощенном виде выглядит так:

// псевдокод на C++,

// иллюстрирующий внутреннюю вставку конструктора при обработке new

int main()




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