|
Программирование >> Аргументация конструирования
Лфеф4рка /cuHOHfrqjofra Поскольку в этой главе проводятся параллели между конструктором и обычными функциями-членами, я позволю себе еше одну параллель: конструкторы можно перегружать. Словосочетание перегруженная киия означает, что определено несколько функций с одинаковым именем, но разными типами аргументов. Если вы немного подзабьши этот термин, освежите память, обратившись к главе 6, Создание функций . C + + выбирает вызываемый конструктор, исходя из аргументов, передаваемых при объявлении объекта. Например, класс Student может одновременно иметь три конструктора, что продемонстрировано в следующем примере: #include <.i.ostream. h> ttinclude <.string.h> class Student public; Student() cour Создаем студента без имениХп ; semesterHours = О; gpa = С .О; name[О] = \О ; Student (char *pNam,e) cout Создаем студента < < рЫагпе \п ; strncpy (narr.e, oName, fizeorfname; ) ; name [ sizeof (name ) - 1: = \0 ; = 0 ; gpa = Student (char *pName, int xfrHcur., -Moat xfrGPA) cout Создаем студента pNair,e \n ; strncpy (name, pName , slzc-of (name) ) ; name [ si zeof (name ) - 1 ) - \Q ; semesterHours = xf rHf;urs; gpa = xfrGPA; -Student() cout Ликвидируем с-улента\п ; стальные открытые члены... protected: char int semesterHours; gpa; приведенный ниже фрагмент no очереди вызывает каждый из ко.чструкторсв int main (int argcs, char* pArqs[]) { Student noName; Student n( Smell E. Iish ); Student xfer( Upp R. Classman , 80, 2.5); return 0; Поскольку объект noName реализован без аргументов, он конструируется с использованием Student: :Student О, который называется конструктором но умолчанию или пустым конструктором. (Я предпочитаю последнее название, но, поскольку первое более распространенное, в этой книге будет использоваться именно оно.) Объект freshMan создается с использованием конструктора, которому нужен только один аргумент типа char*; объекту xfer требуется конструктор с тремя аргументами. Заметьте, что все три конструктора (и особенно два последних) очень похожи. бавив значения по умолчанию в последний конструктор, все три можно объединить в один, что и сделано в приведенном ниже коде. #include <io3tream.h> linclude <string.h> class Student public: Student (char *pName = no name , int xfr.Hours = 0, float xfrGPA = 0.0) cout Создаем студента pName \n ; strncpy(name, pName, sizeof(name)); tiame [sizeof (name) - 1] = \0 ; semesterHours = xfrHours; qpa = xfrGPA; -Student () cout << Ликвидируем студента\п ; мальные открытые члены.. . protected: char name[40); int semesterHours ; J float gpa; Student noName; Student freshMan( Smell E. Fish ); Student xfer( Dpp R. Classman , 80, 2.5); return 0; Теперь все три объекта строятся с помощью одного и того же конструктора, а значения HO умолчанию используются для аргументов, отсутствующих в объектах f resh- Man и noName. В ранних версиях C++ вы не смогли бы создать конструктор по умолчанию, предусмотрев значения по умолчанию для всех аргументов. Конструктор по умолчанию должен был быть определен явно. Так что готовы к тому, что некоторые старые версии компиляторов могут потрс-бовать явного определения конструктора по умолчанию. по 11лиичаншо Стоит отметить, что в C++ каждый класс должен иметь свой конструктор. Казалось бы, C++ должен генерировать сообщение об ошибке в случае, когда класс не оснащен конструктором, однако этого не происходит. Дело в том, что для обеспечения совместимости с существующим кодом С, который ничего не знает о конструкторах, C++ автоматически создает конструктор по умолчанию (так сказать, умалчиваемый конструктор по умолчанию), который инициализирует все данные-члены объекта нулями. Если ваш класс имеет конструктор, C++ не будет автоматически его создавать (как только C++ убеждается в том, что это не программа на С, он снимает с себя всю ответственность по обеспечению совместимости). Вывод: если вы определили конструктор для вашего класса и при этом хотите, чтобы класс имел конструктор по умолчанию, то должны явно определить такой конструктор сами. Привсденный ниже фрагмент демонстрирует сказанное. Этот пример вполне корректен. class Student ...то же что и раньше, только без конструкторов int main(int argcs, char* pArgs[]) \ Student noName; return Поскольку noSame объявлен без аргументов, для создания этого объекта С++ вызывает конструктор по умолчанию. Однако в этом примере программист не определил никаких конструкторов для класса student и C++ сам создает конструктор по умолчанию, который просто инициализирует все данные-члены объекта нулевыми значениями. Приведенный далее пример компилятор с негодованием отвергнет. class Student public: Student(char *pName); int main ( int argcs , diar* pArgs { Student noN; } return 0; To, что здесь добавлен конструктор student (char*), выглядит безобидно, но при этом заставляет C++ отказаться от автоматической генерации конструктора по умолчанию. Поэтому компиляция данного кода в GNU C++ вызовет сообщение об ошибке (оно может быть различным у разных компиляторов, но смысл его один: у класса не определен конструктор по умолчанию): Error: по matching function for call Student::Student() (Ошибка: не найдена функция, соответствующая вызову Student::student о )
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |