Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С++ - ООП.doc
Скачиваний:
11
Добавлен:
21.09.2019
Размер:
399.87 Кб
Скачать

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

Конструктор копирования (копии) является конструктором специального вида: он воспринимает в качестве аргумента константную ссылку на объект класса (const тип-класса&) или простую ссылку на объект (тип-класса&)

Пример:

class Coord

{

int x,y;

public:

Coord(const Coord &src); // конструктор копирования

};

Coord::Coord(const Coord &src)

{

x=src.x;

y=src.y;

}

Ссылка передается всякий раз, когда новый объект инициализируется значениями уже существующего объекта. Если не предусмотрен конструктор копии, компилятор генерирует конструктор копии по умолчанию. Такой конструктор создает буквальную копию объекта.

Пример

#include<iostream.h>

#include<conio.h>

#include<math.h>

class ThreeAngle

{

double a,b,c;

public:

ThreeAngle(void);

ThreeAngle(double a,double b,double c);

ThreeAngle(const ThreeAngle & src);

Void input();

Void output();

void set_a(double x){a=x;}

void set_b(double x){b=x;}

void set_c(double x){c=x;}

double get_a(){return a;}

double get_b(){return b;}

double get_c(){return c;}

double med1(double a,double b,double c)

{return sqrt(2*(b*b+c*c)-a*a)/2;}

double med2(double a,double b,double c)

{return sqrt(2*(a*a+c*c)-b*b)/2;}

double med3(double a,double b,double c)

{return sqrt(2*(b*b+a*a)-c*c)/2;}

double noparmed1(void)

{return sqrt(2*(b*b+c*c)-a*a)/2;}

double noparmed2(void)

{return sqrt(2*(a*a+c*c)-b*b)/2;}

double noparmed3(void)

{ return sqrt(2*(b*b+a*a)-c*c)/2;}

};

ThreeAngle::ThreeAngle(void)

{

a=0; b=0; c=0;

}

ThreeAngle::ThreeAngle(double a1,double b1,double c1)

{

a=a1; b=b1; c=c1;

}

ThreeAngle::ThreeAngle(const ThreeAngle & src)

{

a=src.a; c=src.c; b=src.b;

}

Void ThreeAngle::input()

{ cout<<"Give a"; cin>>a;

cout<<"Give b"; cin>>b;

cout<<"Give c"; cin>>c;

}

Void ThreeAngle::output()

{

cout<<"a="<<a<<endl;

cout<<"b="<<b<<endl;

cout<<"c="<<c<<endl;

}

Void main(void)

{

do

{

ThreeAngle k;

k.input();

k.output();

cout<<"med1="<<k.noparmed1()<<endl;

cout<<"med2="<<k.noparmed2()<<endl;

cout<<"med3="<<k.noparmed3()<<endl;

ThreeAngle l(5,5,5);

l.output();

cout<<"med1="<<l.med1(5,5,5)<<endl;

cout<<"med2="<<l.med2(5,5,5)<<endl;

cout<<"med3="<<l.med3(5,5,5)<<endl;

ThreeAngle m(l);

m.output();

cout<<"med1="<<m.noparmed1()<<endl;

cout<<"med2="<<m.noparmed2()<<endl;

cout<<"med3="<<m.noparmed3()<<endl;

}

while(getch()!=27);

}

Дружественные функции

Одним из важных принципов С++ является возможность защиты данных от несанкционированного использования. Этот принцип реализуется благодаря режиму доступа к членам класса. Члены класса с режимом доступа private могут использовать только функции-члены этого класса. Однако возникают ситуации, когда необходимо, чтобы к приватной части класса имела доступ функция, не являющаяся членом этого класса. Это можно сделать при объявлении класса, объявив эту функцию, используя ключевое слово friend.

Пример

class c1

{

public:

friend void frd(void);

};

frdдружественная функция (friend function) класса с1.

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

Пример объявления двух классов, в каждом из которых объявлена дружественная функция int same_color(line l, box b), не являющаяся членом ни первого, ни второго класса.

class box

{

int color;

int upx,upy;

int lowx,lowy;

public:

friend int same_color(line l, box b);

void set_color(int c);

void define_box(int x1, int y1, int x2, int y2);

void show_box(void);

};

class line

{

int color;

int startx,starty;

int len;

public:

friend int same_color(line l, box b);

void set_color(int c);

void define_line(int x,int y, int len);

void show_line(void);

};

Дружественная функция в нашем примере должна сравнивать значения переменной в каждом из классов и возвращать значений 1, если их значения одинаковы, и 0 в противном случае.

// Описание дружественной функции

int same_color(line l, box b)

{

if (l.color==b.color) return 1;

return 0;

}

void main(void)

{

line l;

box b;

b.define_box(5,5,25,10); // прямоугольная область

b.set_color(RED);

l.define_line(5,15,30); // линия

l.set_color(BLUE);

b.show_box();

l.show_line();

if (same_color(l,b))

cout<<”Одинаковые цвета”<<endl;

else

cout<<”Различные цвета”<<endl;

getch();

}