
- •Указатель this
- •Void print ( void) void print ( void)
- •Void main ()
- •Void que::add(void)
- •Void que::print (void)
- •Void main( )
- •Перегрузка функций
- •Void f ( int );
- •Void f (int, int);
- •Void f ( char* );
- •Void f ( int)
- •Void main ()
- •Void main ( )
- •Перегрузка конструкторов
- •Перегрузка стандартных операций
- •Void main ( )
- •Void main ( )
- •Void vivod ( ) // выводит данные
- •Void main ( )
- •Void display( )
- •Void main ( )
- •Перегрузка операции присваивания
- •Объект1
- •Int GetX ( ) { return X; }
- •Void main ()
- •Блокировка копирования и присваивания:
- •Преобразование типов в классах пользователя
Void display( )
{ cout<< “\n N = “ <<N <<” X= “ << X ; }
} ;
pair & operator ++ ( pair & P) // префиксная
{ P. N + = 1 ; P.X +=1.0 ;
return P; }
pair & operator ++ ( pair & P, int k) // постфиксная
{ P. N + = 1+k ; P.X +=1.0 +k ;
return P; }
Void main ( )
{ pair A ( 9, 19.0); A.display( );
++A; A.display ();
- - A; A.display ();
A++ ; A.display ();
A- - ; A.display (); }
Результат:
N = 9 X = 19
N = 10 X = 20
N = 9 X = 19
N = 10 X = 20
N = 9 X = 19
Перегрузка операции присваивания
Перегрузку операции ”=” разрешается реализовывать только через компонентную функцию класса!
Рассмотрим перегрузку для класса комплексных чисел:
Complex& Complex :: operator = ( Complex & z)
{ re = z.re ; im = z. im ;
return * this ; }
При выполнении
c2=c1 ;
операция функция вызывается для объекта с2 , объект с1 передается в нее как параметр. Данным объекта с2 присваиваются данные объекта с1.
Функция возвращает текущий объект для того, чтобы можно было использовать операцию множественного присваивания :
с3 = с2 = с1 ;
Заметим, что в данном случае перегружать операцию присваивания нет особой необходимости. Если не перегружать “=” , то компилятор генерирует операцию присваивания по умолчанию, которая выполняет побайтовое копирование данных.
Однако в некоторых случаях, при наличии в классе данных, являющихся указателями на динамические участки памяти, буквальное копирование может привести к утечкам памяти.
Объект1
Объект2
При прямом копировании объект2=объект1 указателю объекта2 присвоится значение указателя объекта1. Участок памяти с данными 2 станет недоступным программе происходит утечка памяти. Уничтожение объекта 1 автоматически уничтожит объект2.
В этом случае необходимо перегрузить операцию присваивания:
class A { int* data;
…
A ( int a)
{ data = new int;
*data= a; }
A ( A&z)
{ data = new int;
data=*(z.data);}
A& operator= ( const A & z)
{delete data; или { *data = *(z.data);
data = new int; return *this ;}
*data = *(z.data);
return * this}
…
} ;
Различие между копированием и присваиванием:
Дублирование объекта может быть выполнено и с помощью операции присваивания и с помощью вызова конструктора копирования.
class A { int x;
public:
A ( int ax=0){ x=ax; }
Int GetX ( ) { return X; }
… } ;
Void main ()
{ A m1(5) , m2;
m2 = m1; // операция присваивания
A m3 = m1 ; // дублирование вызовом конструктора копирования
cout<< m1.GetX ( ) << m2.GetX ( ) << m3.GetX ( );
}
В предложении:
m2 = m1 ;
передача значений выполняется в уже созданный объект. Дублирование объекта производится операцией присваивания по умолчанию.
В предложении:
A m3 = m1 ;
создается новый объект, и ему передаются данные копируемого объекта. В этом случае вызывается конструктор копирования по умолчанию.
В ряде случаев объекты должны создаваться в единственном экземпляре, создание идентичных объектов должно быть запрещено.