Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lect03

.pdf
Скачиваний:
5
Добавлен:
06.02.2016
Размер:
630.29 Кб
Скачать

Такбылодо...

Вариант на 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()

{

// ...

}

};

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]