Неявный конструктор копирования и неявный оператор присваивания вызывают проблемы в классах, использующих динамическую память.

Пример 3.

Класс комплексные числа.

Выполните программу.

 

#include <iostream>

using namespace std;

class cm{ float re,im; public: cm(){re=im=0;}//конструктор без параметров cm(int _re,int _im){re=_re;im=_im;}//конструктор с параметрами void set();//функция ввода(без параметров) void show();//функция печати (без параметров) cm sum(cm ob) ; //функция суммирования объекта ob и текущего объекта   int eq(cm ob);//функция сравнения двух объектов на равенство   cm sum1(int a);//функция прибавления к текущему объекту целого числа   } ;  

 

int main() { cm ob1,ob2(5,-7),ob3;//создание 3-ех объектов ob2.show();//вывод объекта ob2 ob1.set(); ob1.show();//ввод и выод объекта ob1 ob3=ob1.sum(ob2); ob3.show();//нахождение объекта - суммы двух объектов //и вывод результата cout<<ob1.eq(ob2)<<endl;//вывод результата сравнения двух объектов ob1.sum1(8); ob1.show();//прибавление к компонентам объекта числа и //вывод результата return 0; }    

 

void cm::set(void)//описание метода set {cout<<"re,im=? ";cin>>re>>im;}   void cm::show(void)// описание метода show {cout<<re; if(im>0)cout<<"+i"<<im<<endl; else cout<<"-i"<<-im<<endl;}   cm cm::sum(cm ob) //функция суммирования объекта ob и текущего объекта { cm t; t.re=re+ob.re; t.im=im+ob.im; return t;}   int cm::eq(cm ob)//функция сравнения двух объектов на равенство {return re==ob.re&&im==ob.im;}   cm cm::sum1(int a)//функция прибавления к текущему объекту целого числа {re=re+a; im=im+a; return *this; }  

 

Результаты выполнения программы

5-i7 re,im=? 10 20 10+i20 15+i13 18+i28  

 

Упражнение. Добавьте методы: вычитание, умножение, деление комплексных чисел, нахождение в текущем объекте суммы текущего объекта и объекта, заданного в качестве параметра, операция ++. Замените конструктор с параметрами конструктором с параметрами по умолчанию  

 

 

Упражнение Объявите класс “Дробь” и напишите клиентскую программу    

 

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

test ar[3];

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

test ar[3]={-1,-2,-3};

При инициализации массива объектов, конструкторы которых принимают несколько аргументов, используется более длинный формат инициализации. Например,конструктор test1 принимает два аргумента:

 

class test1{

private:

int i,j;

public:

test1(int _i,int _j){i=_i; j=_j;}

};

 

main(){

//длинный формат инициализации массива объектов

test1 a[3]={ test1(1,2),test1(3,4),test1(5,6) };

. . .

}

 

Указатели на объекты позволяют также получить доступ к объекту.

Пример.

test a(1), *p; //объявляем объект a и указатель на него - p

a.print();

p=&a; //присваиваем указателю адрес объекта

p->print(); //получаем доступ к объекту с помощью указателя

 

 

Функции-“друзья”разрешают функциям, которые не являются членами этого класса, доступ к закрытым членам класса.

Для объявления функции “другом” класса в объявление класса включается прототип функции в public-разделе объявления класса, прототип предваряется ключевым словом friend.

Функции-“другу” в качестве параметров передается один или несколько объектов класса, для которого она является другом.

Реализация функции-друга не использует квалификацию имени функции именем класса.

Функция-“друг” вызывается обычным образом, т.е. без привязки к объекту ( и без использования оператора “точка”).

 

Пример.Функция-другprint используется для доступа к закрытой переменной класса.

class test{

private:

int i;

public:

test(int _w=0){i=_w;}

~test(){ }

friend void print(test ob);//функция print –“друг” класса test

};

//реализация функции print (print не является членом класса)

void print(test ob)

{

cout<<ob.i<<endl;//функция имеет право на прямой доступ к члену класса i

}

 

main(){

 

test a(1);

print(a);//функция-“друг” вызывается обычным образом

test b;

print(b);

. . .

}