Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры(ооп) кроме 45,46,52.docx
Скачиваний:
2
Добавлен:
24.09.2019
Размер:
117.21 Кб
Скачать

1.Конструктор копирования

Общий вид конструктора копирования имеет следующий вид:

имя_класса (const имя_класса & );

Конструктор выполняет все необходимые действия при вызове функции и копировании содержимого объекта в стек (из стека). Вызов конструктора копирования осуществляется при обращении к функции и передаче в нее в качестве параметра объекта (объектов), а также возврата значения (объекта) из функции.

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

выделения памяти).

2.Перегрузка переопределение функц

Одним из подходов реализации принципа полиморфизма в языке С++ является использование перегрузки функций. В С++ две и более функций могут иметь одно и то же имя. Компилятор С++ оперирует не исходными именами функций, а их внутренним представлением, которое учитывает количество и тип принимаемых аргументов. В то же время тип возвращаемого функцией значения не учитывается. Поэтому для компилятора функции с различным списком аргументов – это разные функции, а с одинаковым списком аргументов, но с разными типами возвращаемого значения – одинаковые. Для корректной работы программ последнего следует избегать. Функции, имеющие одинаковые имена, но разные списки аргументов, называются перегруженными.

class cls {int n;double f;

public: cls(int N,float F) : n(N),f(F) {}

int sum(int k){ n+=k; return n;}

double sum(double k){ f+=k; return f;}

void see(){cout <<n<<' '<<f<<endl;}};

void main(){ cls obj(1,2.3); obj.see();cout <<obj.sum(1)<<endl; cout <<obj.sum(1.)<<endl; }

3.Перегрузка бинарных операторов

Функция operator для перегрузки (доопределения) бинарных операторов может быть описана двумя способами:

как компонента-функция класса с одним аргументом;

как глобальная функция (функция, описанная вне класса) с двумя аргументами.

При перегрузке бинарного оператора # выражение a#b может быть представлено при первом способе как a.operator#(b) или как operator #(a,b) при втором способе перегрузки.

*, = , > и ==

class dek_koord

{ int x,y; public: dek_koord(){};

dek_koord(int X,int Y): x(X),y(Y) {}

dek_koord operator*(const dek_koord );};

dek_koord dek_koord::operator*(const dek_koord a)

{ dek_koord tmp; tmp.x=x*a.x; tmp.y=y*a.y;return tmp;}

void main(){ dek_koord A(1,2), B(3,4), C;

A.see(); B.see(); C=A*B; C.see();}

4.Перегрузка унарных операторов

При перегрузке унарной операции функция operator не имеет параметров. Унарный оператор, может быть перегружен двумя способами:

как компонента-функция без аргументов;

как глобальная функция с одним аргументом.

унарный оператор может быть префиксным и постфиксным. Для любого префиксного унарного оператора выражение #a может быть представлено при первом способе как a.operator#(), а при втором как #operator(a). При перегрузке унарного оператора в постфиксной форме, выражение вида a# при первом способе как a.operator#(int) или как operator#(a,int) при втором способе. При этом аргумент типа int не существует и используется для отличия префиксной и постфиксной форм при перегрузке.

class dek_koord{ int x,y; public: dek_koord(){};

dek_koord(int X,int Y): x(X),y(Y) {}

void operator++(); void operator++(int);

void see();};

void dek_koord::operator++() // ++A { x++;}

void dek_koord::operator++(int) // A++ { y++;}

void dek_koord::see()

{ cout << " х = " << x<< "y = " << y;}

void main(){ dek_koord A(1,2), B, C; A.see(); A++; A.see();}

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