- •Введение в понятие класса
- •Void queue::init(void)
- •Перегруженные функции
- •Int sqr_it(int I); // Прототипы
- •Перегрузка операций.
- •Наследование
- •Конструкторы и деструкторы
- •Int sloc,rloc;
- •Void qput(int); // Прототип
- •Int qget(void); // Прототип
- •Конструктор с параметрами
- •Конструктор копирования
- •Void input();
- •Void output();
- •Void ThreeAngle::input()
- •Void ThreeAngle::output()
- •Void main(void)
- •Дружественные функции
- •Замечание
- •Дружественные классы
- •Аргументы функций, задаваемые по умолчанию
- •Void main(void)
- •Void stringxy(char *str, int X, int y)
- •Структуры и классы
- •Объединения и классы
- •Void main()
- •Наследование классов
- •Конструкторы с параметрами при наследовании
- •Множественное наследование
- •Перегрузка функций и операций
- •Ключевое слово this
- •Перегрузка операций ввода/вывода. Инсерторы и экстракторы
- •Void main(void)
- •Vector a(1,2,3),b(4,5,6);
- •Void main(void)
- •Vector a(1,2,3),b(4,5,6);
- •Void main(void)
- •Vector a(1,2,3);
- •Дружественные функции-операции
- •Void main(void)
- •Void swap1(int *I, int *j)
- •Void swap(int a, int b)
- •Void swap1(int *I, int *j)
- •Void swap2(int &a, int &b)
- •Использование ссылочных переменных для перегрузки унарных операций
- •Перегрузка операции индексации [ ]
- •Использование виртуальных функций
- •Указатели на производные типы
- •Виртуальные функции
- •Замечания к использованию виртуальных функций
- •Пример использования виртуальных функций
- •Чистые виртуальные функции и абстрактные типы
- •Производные классы и их конструкторы и деструкторы
- •Void main()
- •Конструкторы и деструкторы при множественном наследовании
- •Void main()
- •Виртуальные базовые классы.
- •Операции динамического выделения памяти new и delete
- •Void main(void)
- •Void main(void)
- •Виртуальные деструкторы
- •Void main(void)
- •Void main(void)
- •Шаблоны классов и функций
- •Шаблоны функций
- •Void main(void)
- •Void main(void)
- •Шаблоны классов
- •Int sloc, rloc;
- •Void qput(t I);
- •Void main(void)
- •Статические члены класса
- •Локальные классы
- •Void f(void);
- •Void main(void)
- •Void f(void)
- •Вложенные классы
- •Void main(void)
Конструктор копирования
Конструктор копирования (копии) является конструктором специального вида: он воспринимает в качестве аргумента константную ссылку на объект класса (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();
}