Неявный конструктор копирования и неявный оператор присваивания вызывают проблемы в классах, использующих динамическую память.
Пример 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);
. . .
}