|
Программирование >> Программирование на языке c++
class my class { public: int a,b,*c; nfiy class(int A) : a{A),b(a),c(&A) {}; void fun(my class& M) { cout M.a \t M.b V M.c endl;} void main(void) { my class ms = my class(100); my class MC = 200; fun(ms); Результат: 100 100 0x1c640ff6 fun(MC); Результат: 200 200 0x1c640fec Описание my class MC = 200; задает объект МС(200), т. е. в конструктор этого объекта должно быть передано значение 200. Если конструктор имеет только один параметр, то описания my class МС = 200; и my class МС(200); являются эквивалентными. Конструктор my class(int А) : а(А),Ь(а),с(&А) {}; выполняет следующие действия: а=А, &Ь=а (теперь Ь - это ссылка на а), с=&А. Значение адреса в результатах (типа 0xlc640ff6) на разных компьютерах будет изменяться. В заключение перечислим основные свойства и правила использования конструкторов: -♦ конструктор имеет то же имя, что и класс, в котором он объявляется; -♦ конструктор не возвращает значения (даже типа void); -♦ конструктор не наследуется в производных классах. Если необходимо, то конструктор производного класса может вызвать конструкторы для его базовых классов; конструктор может иметь аргументы, заданные по умолчанию; конструктор - это функция, но он не может быть виртуальным (его нельзя объявить с ключевым словом virtual); -♦ невозможно получить в программе адрес конструктора (указатель на конструктор); -♦ если конструктор не задан в программе, то он будет автоматически сгенерирован компилятором для построения соответствующих объектов. Все конструкторы, сгенерированные компилятором, имеют атрибут public; конструктор по умолчанию для класса X - это конструктор, который может быть вызван без аргументов; конструктор вызывается автоматически только при описании объекта; -♦ объект, содержащий конструктор, нельзя включить в виде компонента в объединение (union); -♦ конструктор класса X не может иметь аргумент типа X; -♦ конструктор класса X может иметь аргумент типа Х& (ссылку на объект типа X); -♦ конструктор, заданный в виде X::X(const Х&), называется конструктором для копирования (сору constructor) класса X; -♦ для конструктора работает механизм доопределения имени (function name overloading). Например, можно рассмотреть конструкторы X::X(int), X::X(char), X::X(float) и т. п. Дополнительные правила использования конструкторов будут рассмотрены в § 3.12 и в гл. 4, 5. 3.5. Разрушение объекта (деструкторы) Выше было указано, что конструктор используется для инициализации (построения) объекта. В классе можно также объявить диаметрально противоположную функцию, используемую для разрушения объекта (удаления всей, связанной с объектом, информации из компьютерной памяти). Такая функция называется деструктором (от англ. destructor ). Деструктор имеет то же имя, что и класс, с префиксом тильда (~). Например, для класса my class деструктор будет иметь имя ~my class. Типовое использование деструктора - это освобождение динамической памяти, выделенной ранее конструктором. Напомним, ЧТО если в классе не объявлены конструкторы и деструкторы, то компилятор автоматически производит их построение. При этом конструктор используется для вьщеле-ния памяти и размещения объекта после его описания, а деструктор - для освобождения памяти после того, как имя объекта становится недействительным. Рассмотрим пример использования конструктора: #include <iostream.h> #include <string.h> файл заголовка для функции strcpy class my class { char* str; unsigned size; public: my class(char* s,unsigned SIZE=100); объявление конструктора ~my class(); объявление деструктора void displayO { cout str endl; } my class::my class(char* s,unsigned SIZE) описание конструктора { str = new char[size=SIZE]; cout I am created: size = size endl; strcpy(str,s); } my class::~my class{) описание деструктора { cout I am destroyed: size = size endl; delete[] str; } void main(void) { my class A( Regards ); второй аргумент по умолчанию char ss[] = Computer Department of BSUIR ; my class *P = new my class(ss,sizeof(ss)); P->display{); Результат: Computer Department of BSUIR delete P; Результат: I am destroyed: size = 29 A.displayO; Результат: Regards Здесь выражение my class *P = new my class(ss,sizeof (ss));
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |