- •1. Конструкторы и деструкторы
- •Конструкторы.
- •Int II; float ee; char cc;
- •Конструктор с параметрами или конструктор общего вида.
- •Конструктор с аргументами, задаваемыми по умолчанию.
- •Конструктор по умолчанию.
- •Конструктор копирования.
- •Определение конструктора копирования.
- •Деструкторы
- •Int main () {
- •Int main ( ) {
- •Void Print ( My obj )
- •Int main ( ) {
- •2. Указатели на поля данных и на методы класса.
- •Int main (){
- •3.Указатель this
- •Int X, y ; public:
- •Void print ( void)
- •Int main ()
- •Void que::add( ) {
- •Void que::print (void)
- •Int main( )
- •4. Перегрузка функций
- •Перегрузка конструкторов
Конструктор копирования.
Конструктор копирования вызывается, когда:
надо создать объект, полностью совпадающий с уже созданным;
надо передать по значению в некоторую функцию экземпляр класса, при этом в стеке создается локальная копия объекта, с которым и работает функция;
надо создать объект полностью идентичный объекту, который возвращает некоторая функция посредством оператора return.
В большинстве случаев компилятор предоставляет нам конструктор копирования по умолчанию, который обеспечивает правильное копирование.
Рассмотрим копирование с использованием конструктора копирования по умолчанию:
class T {
int x, y ;
public:
T ( int tx, int ty ) { x = tx; y = ty; }
int GetX ( ) { return x; }
int GetY ( ) { return y; }
friend T sum ( T, T);
};
void Print ( T obj ) {
cout<<'\n'<<" x = "<<obj.GetX( ) <<" y = "<<obj.GetY( );
}
T sum ( T obj1, T obj2 ){
obj1. x + = obj2. x;
obj1. y + = obj2. y;
return obj1;
}
#include <iostream>
using namespace std;
int main () {
T e1 (1, 10);
//создается объект, вызывается конструктор с параметрами
Print (e1); //создание локальной копии объекта e1
Te2 = e1; //создание объекта e2 копированием объекта e1
Print (e2); //создание локальной копии объекта e2
Te3 = sum (e1, e2); //создание локальных копий объектов e1и e2
//и создание объекта e3 копированием объекта, возвращаемого функцией sum()
Print (e3); //создание локальной копии объекта e3
return 0;}
Результат программы:
x= 1 y = 10
x= 1 y = 10
x= 2 y = 20
Определение конструктора копирования.
При поиске формы определения конструктора копирования следует учесть следующие соображения.
Во-первых, объект, копия которого создается, не должен копироваться в конструктор копирования, а должен передаваться в него по ссылке. Иначе в конструкторе копирования вызывался бы сам конструктор копирования и возникала бы бесконечная рекурсия.
И во-вторых – необходимо ввести запрет на модификацию копируемого объекта, и для этого следует перед объектом - параметром поставить ключевое слово const.
Учитывая вышесказанное, формат определения конструктора копирования для описанного выше класса должен быть следующим:
T ( const T &obj ) { x = obj.x; y = obj. y;}
Если пользователь определил в классе конструктор копирования, то в случаях создания объектов – копий будет вызываться конструктор копирования, определенный в классе.
Однако свой конструктор копирования нужен не всегда. Копирование по умолчанию (когда конструктор копирования предоставляет компилятор) осуществляет как правило правильное копирование полей данных и без явного определения в классе конструктора копирования.
Обязательное его определение должно быть в тех случаях, когда класс содержит поля, являющиеся указателями на динамические участки памяти, при создании так называемых ресурсоемких объектов.
Прежде чем рассмотрим копирование ресурсоемких объектов, рассмотрим еще один очень важный метод классов, называемый деструктором.
