Lect03
.pdfТакбылодо...
Вариант на plain C:
void swap(int* i, int* j){ int tmp;
tmp = *i; *i = *j;
*j = tmp;
}
int main(){
int x = 5, y = 7; swap(&x,&y); return 0;
}
АтаквC++.
Вариант на C++:
void swap(int& i, int& j){ int tmp = i;
i = j;
j = tmp;
}
int main(){
int x = 5, y = 7; swap(x, y); return 0;
}
Копирующийконструктор
Копирующийконструкториспользуется длясозданияновогообъекта.
Сигнатура:
A::A(const A&);
Пример:
A a; A b(a);
Безкопирующегоконструктора. Пример.
#include <stdio.h>
#include <stdlib.h>
class DynMem { private:
int *data; int size;
public:
DynMem(int sz);
~DynMem();
int GetSize() const { return size; } int GetElement(int index) const
{ return data[index]; }
void SetElement(int index, int val) { data[index] = val; }
};
Безкопирующегоконструктора. Пример.
DynMem::DynMem(int sz) : size(sz)
{
data = new int[sz];
}
DynMem::~DynMem() { delete data; }
int main(int argc, char *argv[]) { DynMem mem(5); mem.SetElement(0, 1); mem.SetElement(1, 2);
DynMem mem2(mem); mem2.SetElement(1, 11);
printf("%d\n", mem.GetElement(1)); printf("%d\n", mem2.GetElement(1));
return EXIT_SUCCESS;
}
Чтоизэтоговышло:
11
11
*** glibc detected ***
/home/max/prg/cpp/Lect05_1/debug/./s rc/lect05_1:
double free or corruption (fasttop): 0x0000000000601010 ***
Причинапроблем.
mem
DynMem |
Массив data |
-data : double* |
{1, 2} |
-size : int |
|
+GetSize() : int |
|
+GetElement(в index : int) : double |
|
+SetElement(в index : int, в val : double) : void |
|
ДовызоваSetElement
mem2
DynMem
-data : double* -size : int
+GetSize() : int
+GetElement(в index : int) : double +SetElement(в index : int, в val : double) : void
ПослевызоваSetElement
Причина"вылета"вОС.
Вызовдеструктораmem2
Вызовдеструктораmem - нокакосвобождатьуже освобожденнуюпамять поуказателюdata ???
Здесьиполучаем
double free or corruption
Добавимкопирующий
конструктор
...
/*Конструктор копирования*/
DynMem(DynMem &src);
...
};
DynMem::DynMem(DynMem &src) { size=src.size;
data = new int[size];
memcpy(data, src.data, size*sizeof(int));
}
Результаты:
2
11
inline-функциииметоды
inline-функции
inline void f(int i, char c)
{
// ...
}
inline-методы
Способ объявления 1:
class Test { public:
void funct()
{
// ...
}
};