<p id="chapter17.1"><strong>►Как снабдить конструктор аргументами...198</strong></p>

С++ позволяет программисту определить конструктор с аргументами, например:

    class Student

    {

    public :

        Student( char *pName ) ;

        /* Продолжение класса Student */

    } ;

<p id="chapter17.1.1"><emphasis><strong><emphasis>Зачем конструкторам нужны аргументы...198</emphasis></strong></emphasis></p>

Возможность добавления аргументов к конструктору не требует особой, простите за каламбур, аргументации, но я всё же приведу несколько аргументов, аргументируя пользу применения аргументов. Во-первых, их использование в конструкторе достаточно удобно. Было бы несколько непоследовательно требовать от программиста сначала конструировать объект, а затем вызывать инициализирующую функцию с тем, чтобы она проводила инициализацию, специфичную для данного объекта. Конструктор, поддерживающий аргументы, похож на супермаркет: он предоставляет полный сервис.

_________________ 

198 стр. Часть 3. Введение в классы

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

Например, банковский счёт без номера не является приемлемым ( С++ всё равно, каков номер счёта, но это почему-то волнует банк ). Можно создать объект BankAccount без номера, а затем потребовать от приложения вызвать некоторую функцию-член для инициализации номера счёта перед использованием. Однако это нарушает наши правила, поскольку при таком подходе класс вынужден полагаться на то, что эти действия будут выполнены внешним приложением.

<p id="chapter17.1.2"><emphasis><strong>Как использовать конструктор с аргументами...199</strong></emphasis></p>

Идея использования аргументов проста. Как известно, функции-члены могут иметь аргументы, поэтому конструктор, будучи функцией-членом, тоже может иметь аргументы.

При этом нельзя забывать, что вы вызываете конструктор не как нормальную функцию и передать ему аргумент можно только в момент создания объекта. Так, приведённая ниже программа создаёт объект s класса Student, вызывая конструктор Student( char* ). Объект s уничтожается в момент возврата из функции main( ).

    //

    /* ConstructorWArg — конструктор с аргументами */

    //

    #include

    #include

    #include

    #include

    using namespace std ;

    const int MAXNAMESIZE = 40 ;

    class Student

    {

        public :

            Student( char* pName )

            {

                strncpy( name , pName , MAXNAMESIZE ) ;

                name[ MAXNAMESIZE - 1 ] = '\0' ;

                semesterHours = 0 ;

                gpa = 0.0 ;

            }

        /* ...прочие открытые члены... */

        protected :

            char name[ MAXNAMESIZE ] ;

            int semesterHours ;

            float gpa ;

    } ;

    int main( int argcs , char* pArgs[ ] )

    {

        setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */

        Student s( "О. Danny Boy" ) ;

        Student* pS = new Student( "E. Z. Rider" ) ;

        /* Пауза для того, чтобы посмотреть на результат работы программы */

        system( "PAUSE" ) ; return 0 ;

    } 

_________________

199 стр. Глава 17. Аргументация конструирования

В этом примере конструктор выглядит почти так же, как и конструктор из главы 16, "Создание и удаление объектов", с тем лишь отличием, что он принимает аргумент pName, имеющий тип char*. Этот конструктор инициализирует все данные-члены нулевыми значениями, за исключением члена name, который инициализируется строкой pName.

Объект s создаётся в функции main( ). Аргумент, передаваемый конструктору, находится в строке объявления s сразу же за именем объекта. Благодаря такому объявлению студент s получил имя Danny. Закрывающая фигурная скобка функции main( ) вызывает гром и молнию деструктора на голову несчастного Danny. Аналогично создаётся объект в куче. 

 

«Многие конструкторы в этой главе нарушают правило "функции размером больше трёх строк не должны быть inline-функциями". Я просто решил облегчить вам чтение ( а теперь — ваши аплодисменты! ).» 

[Атас!]

Перейти на страницу:

Все книги серии Для чайников

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