Программирование >>  Немодифицирующие последовательные алгоритмы 

1 ... 30 31 32 [ 33 ] 34 35 36 ... 78


class Т { public:

T(int n){а = new double[n];} ~T(){delete[] a;}

double *a;

Здесь мы опять пишем delete[] а для предотвращения утечки памяти. Если для вьщеления памяти использовать конструктор вектора, то можно обойтись без явного освобождения памяти, как демонстрирует следующая программа:

vecmem.cpp: Вектор - член класса, iinclude <iostream> iinclude <vector> iinclude <numeric> using namespace std;

template <class eltype> class objtype { public:

objtypelint n=0): a(n){}

vector<eltype> a;

int mainO { int n, i;

double s=0;

cout Enter n: ;

cin >> n; n is a positive integer

objtype<double> x(n);

for (i=0; i<n; i++) x.a[i] = i;

s = accumulate(x.a.begin() , x.a.endO, s);

cout s = double(n-1)*n/2 endl;

return 0;

Объекта:содержит массив о из и значений типа double, где п вводится пользо- вателем. Для заполнения этого массива мы используем значения 0,1,и - 1. Далее вычисляем сумму элементов массива, применяя алгоритм accumulate, который был рассмотрен в разделе 2.1. Другими словами, мы получим

0+1 + 2 + ...+ и-1 = У2и(и-1)

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



пример использования этой программы для нахождения значения Ух 100000 X 99999 = 4999950000 = 4.99995 х 10 :

Enter п: 100000 4.99995е+09 = 4.99995е+09

Не требуется определять конструкторы копирования и операторы присваивания

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

simple.срр: Не нужен ни конструктор копирования, ни оператор присваивания,

♦include <iostream> iinclude <vector> iinclude <numeric> using namespace std;

template <class eltype> class objtype { public:

objtype(int n=0): a(n, 0){ } vector<eltype> a;

int mainO { int i; double s;

objtype<double> x(3), y(x);

Или, если использовать присваивание,

а не инициализацию:

objtype<double> х(3), у;

у = х;

х.а[1] = 123;

сору (х. а.begin О , х.a.endO,

ostream iterator<double>(cout, )); cout endl;

copy(y.a.begin() , y.a.endO,

ostream iterator<double>(cout, )); cout endl; return 0;



Вывод

О 123 О ООО

ЭТОЙ программы со всей очевидностью показывает, что объекты х н у не зависят друг от друга: начальное значение у (О, О, 0) никуда не исчезает, когда присваиваем х другое значение. Если бы мы выделили память в конструкторе objtype с помощью оператора new, проведение инициализации, как выше, с использованием глубокого копирования начального значения х для у потребовало бы написать конструктор копирования. Для приведенной версии программы в этом нет необходимости, поскольку используется конструктор копирования класса vector, определенный в STL. Точно так же нет необходимости писать свой оператор присваивания, что отмечено в комментарии к тексту программы.



1 ... 30 31 32 [ 33 ] 34 35 36 ... 78

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика