|
Программирование >> Немодифицирующие последовательные алгоритмы
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. Точно так же нет необходимости писать свой оператор присваивания, что отмечено в комментарии к тексту программы.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |