- •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. Перегрузка функций
- •Перегрузка конструкторов
Void Print ( My obj )
{cout<<'\n'<<obj.Get ( );}
Int main ( ) {
My a1 (10); // создаем объект, данное инициализируется //значением
//10
My a2 = a1; // с помощью конструктора копирования создаем
//объектa2,
Print (a1);
Print (a2);
a1.~My ( ); // вызовом деструктора память для данного a1
//освобождается
Print (a1); //мусор
Print (a2); // выведется 10
}
Результат программы:
10
10
7853
10
2. Указатели на поля данных и на методы класса.
Две операции языка С++ .* и ->* предназначены для работы с указателями на поля данных и методы класса.
Формат определения указателя на поле данных класса:
тип_данных имя_класса :: *имя_указателя;
В определение указателя можно включить его явную инициализацию, используя адрес конкретного поля данных из соответствующего класса:
&имя_класса ::имя_поля_данных;
При этом поле данных должно быть открытым.
Рассмотрим пример использования указателя на поля данных.
struct complex1{
double re, im;
compex1 (double _re, double _im) {re=_re; im=_im;}
double real ( )
{ return re; }
double image ( )
{ return im; }
};
Int main (){
complex1 comp (16.0, 30.5); complex1*ptr= ∁
//определение указателя на поле данных класса с инициализацией
double complex1::*pdat=& complex1::re;
cout<< (comp.*pdat) <<endl;
pdat = & complex1::im; cout<< (comp.*pdat) <<endl;
cout<< (ptr->*pdat);
return 0; }
Результат приведенных операторов:
16
30.5
30.5
Можно определить указатель на компоненты-функции. Вне класса можно следующим образом определить указатель на метод класса:
тип_возвраемого_методом_значения
(имя_класса ::*имя_указателя_на_метод)
(спецификация_параметров_функции);
Рассмотрим пример, определения и использования указателя на метод.
double(complex1 ::*ptcom)(); //определение указателя на метод класса
ptcom = &complex1 ::real; // "настройка" указателя на метод real
complex A (5.2,2.7);
// Теперь для объекта А можно вызвать его метод через указатель
cout<<(A.*ptcom)();
Можно определить также тип указателя на функцию:
typedef double (complex1::*PF)();
а затем определить и сам указатель, например, с инициализацией:
PF ptc=&complex::real;
3.Указатель this
При вызове нестатической функции класса для обработки данных конкретного объекта, ей неявно передается указатель на тот объект для которого она вызывается.
Этот указатель называется this, он константный, значением его является адрес объекта для которого вызывается метод и определен он неявно следующим образом:
имя_ класса *const this = адрес_обрабатываемого_объекта;
При вызове нестатического метода указатель this автоматически инициализируется адресом того объекта, для которого был вызван метод и объект благодаря указателю this становится доступный внутри этого метода.
При работе с полями данных можно так использовать указатель this:
class point {
