Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP / lectures / 3_oop.ppt
Скачиваний:
68
Добавлен:
03.03.2016
Размер:
361.98 Кб
Скачать

Большие объекты

При выполнении любой операции функции, реализующей эту операцию, будут передаваться как параметры копии операндов.

Это может привести к неэффективному использованию памяти в случае, если операнды – «большие» объекты, например объекты классов, инкапсулирующих матрицы векторы.

Чтобы избежать избыточного копирования,

можно определять функции с параметрами

типа ссылки на объекты.

Указатели для этой цели использовать нельзя, т.к. невозможно переопределить интерпретацию операции, если она применяется к указателю.

Пример. Определение операции сложения для матриц.

class matrix { int n,k;

double m[1000][1000]; public:

matrix(int n1 =10, int k1=10){n=n1; k=k1;}; friend matrix operator+(const matrix&, const

matrix&); };

matrix operator+(const matrix& arg1, const matrix& arg2) {

matrix sum;

for (int i = 0; i<arg1.n; i++) for (int j=0; j<arg1.k; j++)

sum.m[i][j] = arg1.m[i][j] + arg2.m[i][j]; return sum;

}

Присваивание и инициализация

В случае, если полем класса является указатель, то, для корректного занятия и освобождения памяти, в классе должен быть определён конструктор копирования и перегружена операция присваивания.

Пример. Определение класса string.

class string { char* p;

int size; public:

string(int sz) {

p = new char[size=sz]; printf("Конструктор с Int\n");

}

~string() { delete p;

printf("Деструктор \n");

}

string& operator=(const string&); string(const string&);

};

string& string::operator=(const string& a)

{

if (this !=&a) { delete p;

p = new char[size=a.size]; strcpy(p,a.p);

}

return *this;

}

string::string(const string& a)

{

p=new char[size=a.size]; strcpy(p,a.p);

printf("Конструктор копирования\n");

}

int main()

{

string *s=new string(10); //конструктор с int string *s1=new string(*s); //конструктор

копирования

string *s2=new string(10); //конструктор с int

*s2=*s1;//операция присванивания

delete s2; delete s1; delete s; return 0;

}

Соседние файлы в папке lectures