Мои Конспекты
Главная | Обратная связь


Автомобили
Астрономия
Биология
География
Дом и сад
Другие языки
Другое
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Металлургия
Механика
Образование
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Туризм
Физика
Философия
Финансы
Химия
Черчение
Экология
Экономика
Электроника

Правильным копированием при наличии в объекте динамического данного будет выделение для создаваемого при копировании объекта нового участка памяти.



Объект a1

       
 
P
 


Данное ( *p)

P
Объект a2

Данное (*p)

В этом случае объекты a1 и a2будут указывать на разные поля. Уничтожение одного из них вызовом деструктора, никак не отразится на существовании другого. Именно это и выполняется в нашем конструкторе копирования.

 

Еще о конструкторах

Есть еще одинспособ инициализации объекта с помощью списка инициализаторов данных объекта.

Этот список помещается при описании конструктора между списком параметров и телом конструктора:

 

<имя класса> ( список параметров) : < список инициализаторов>

{ тело конструктора }

Пример :

Class A

{ int ii ; float ee ; char cc;

public : A( int i , float e , char c ) : ii ( 7),

ee( ii + i * e),

Cc(c)

{ }

. . .

};

A a( 5 , 1.2 . ‘ f’) ;// создается объект с компонентамиa.ii =7 ,

// a.ee = 13 , a.cc=’f’

- Параметром конструктора не может быть его собственный класс, но

может быть ссылка на него.

- В классе может быть несколько конструкторов, но только один с

умалчиваемыми значениями параметров.

- Нельзя получить адрес конструктора.

- Если в определении класса нет конструктора, то компилятор автоматически предоставляет конструктор по умолчанию, который и создает неинициированный объект

<Имя класса> < имя объекта>;

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

<Имя класса> ( ) { };

тогда используя конструкцию

<Имя класса> < имя объекта>;

можно объявить неинициированный объект.

 

Примеры:

1.

… сlass Book {

public :

char title[40];

char author[20];

float price;

Book ( char*atitle, char*aauthor, float aprice ); //прототип

//конструктора

~Book( ) ;// прототип деструктора

void show_book(void) { cout<<’\n’<< title<< “, “<<price ;}

} ;

Book::Book(char*atitle, char*aauthor, float aprice )

{ strcpy(title, atitle); strcpy(author, aauthor);

price = aprice; }

Book::~Book( )

{ cout <<’\n’<< “Уничтожение экземпляра:”<< title ;}

Void main ( )

{ Book tip1 (“Turbo Pascal”, “B.B.Фаронов”, 60.0) ;

Book tip2(“Язык С++” , “В.В.Подбельский”,62.0 );

Tip1.show_book( );

Tip2.show_book( );

}