Программирование >>  Аргументация конструирования 

1 ... 56 57 58 [ 59 ] 60 61 62 ... 108



Лфеф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 о )



1 ... 56 57 58 [ 59 ] 60 61 62 ... 108

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика