Пример 1: Класс, описывающий окружность

#include <iostream>

#include <conio.h>

#include <windows.h>

#define _USE_MATH_DEFINES

#include <cmath>

using namespace std;

class Circle

{

// Элементы данных:

float x, y, r;

/* дружественные функции ввода и вывода (эти функции должны быть именно дружественными, поскольку левым операндом операции является ссылка на поток, а не окружность): */

friend istream& operator >> (istream&, Circle&);

friend ostream& operator << (ostream&, const Circle&);

//функции – члены класса:

public:

//конструкторы:

// два в одном: основной конструктор и конструктор по умолчанию

Circle(float xx=0, float yy=0, float rr=5):x(xx),y(yy),r(rr) {}

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

//деструктор:

~Circle(){}

// функции доступа:

void Set_x(float xx) {x=xx;}

void Set_y(float yy) {y=yy;}

void Set_r(float rr) {r=rr;}

float Get_x() {return x;}

float Get_y() {return y;}

float Get_r() {return r;}

// функции – члены класса, обеспечивающие ввод-вывод:

void input();

void output();

// перегрузка операций:

// операция присваивания =:

Circle& operator = (const Circle &);

//операция +:

Circle operator + (const Circle &);

// операция +=:

Circle& operator += (const Circle &);

//прочие функции:

float Area() {return M_PI*r*r;}

float Line() {return 2*M_PI*r;}

float Mass_Center(int, const Circle*);

};

// Определение функций:

// перегрузка оператора присваивания:

Circle& Circle::operator = (const Circle &obj)

{

if (this!= &obj) // проверка на самоприсваивание (типа с1 = с1;)

{ /* в данном случае просто элементы данных того объекта, который будет стоять слева от знака присваивания (this), становятся равными элементам данных объекта, который будет стоять справа от знака присваивания (obj) */

x=obj.x; y=obj.y; r=obj.r;

}

return *this; /* функция возвращает текущий объект, это позволит выполнять множественное присваивание типа c1 = c2 = c3 */

}

/* перегрузка операции сложения окружностей */

Circle Circle::operator + (const Circle &obj)

{

Circle tmp;

tmp.x = x + obj.x;

tmp.y = y + obj.y;

tmp.r = r + obj.r;

return tmp; /* функция возвращает временный объект, который будет существовать в памяти только во время выполнения операции*/

}

/* перегрузка операции сложения c присваиванием (эта функция позволит изменять параметры окружности, увеличивая или уменьшая их, одной операцией): */

Circle& Circle::operator += (const Circle &obj)

{

x += obj.x;

y += obj.y;

r += obj.r;

return *this; //функция возвращает текущий объект

}

/* функция, которая вычисляет усредненное расстояние от заданной точки (центра текущей окружности) до множества точек (центров других окружностей), так называемый “центр масс” окружностей, по формуле:

*/

float Circle::Mass_Center(int n, const Circle* obj)

//параметрами функции являются количество точек и массив точек

{

float sum = 0;

for (int i=0; i<n; i++)

sum+=sqrt((x + obj[i].x)*(x + obj[i].x)+ (y + obj[i].y)*(y + obj[i].y));

sum/=n;

return sum;

}

// Определение дружественных функций ввода-вывода:

istream& operator >> (istream& is, Circle& obj)

{

cout << "Задайте x:" << endl;

is >> obj.x;

cout << "Задайте y:" << endl;

is >> obj.y;

do

{

cout << "Задайте r:" << endl;

is >> obj.r;

}while(obj.r<0);

return is;

}

ostream& operator << (ostream& os, const Circle& obj)

{

os << "Значение x:" << obj.x << endl;

os << "Значение y:" << obj.y << endl;

os << "Значение r:" << obj.r << endl;

return os;

}

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

Circle::Circle(const Circle& obj)

{

x=obj.x; y=obj.y; r=obj.r;

}

// Функции-члены класса для ввода и вывода:

void Circle::input()

{

cout << "Задайте x:" << endl;

cin >> x;

cout << "Задайте y:" << endl;

cin >> y;

cout << "Задайте r:" << endl;

cin >> r;

}

void Circle::output()

{

cout << "Значение x:" << x << endl;

cout << "Значение y:" << y << endl;

cout << "Значение r:" << r << endl;

}

// пример программы, которая использует класс Circle:

int main()

{

//Настройки шрифтов и региональных стандартов:

if(SetConsoleCP(1251)==0)

//проверка правильности установки кодировки символов для ввода

{

cerr<<"Fialed to set codepage!"<<endl;

/* если не удалось установить кодовую страницу, вывод сообщения об ошибке */

}

if(SetConsoleOutputCP(1251)==0)//тоже самое для вывода

{

cerr<<"Failed to set OUTPUT page!"<<endl;

}

Circle a;

//пример использования основного конструктора:

a.output();

Circle b(5.6, 7.2, 3.7);

b.output();

// пример использования конструктора копирования:

Circle c(b);

c.output();

//пример использования операции присваивания:

b = a;

b.output();

// пример использования дружественных функций ввода-вывода:

cin >> c;

cout << c;

// пример использования функции, вычисляющей “Центр масс” окружностей:

int k=3;

Circle* CM = new Circle[k]; // массив окружностей

for (int i=0; i<k; i++)

cin >> CM[i];

cout << "Центр масс окружностей:" << c.Mass_Center(k,CM)<< endl;

delete [] CM;

// пример применения операции сложения окружностей:

c = a + b;

cout << c;

c += a;

cout << c;

// пример применения функций доступа:

a.input();

a.output();

float xx,yy,rr;

cout << "Задайте значение x:" << endl;

cin >> xx;

cout << "Задайте значение y:" << endl;

cin >> yy;

cout << "Задайте значение r:" << endl;

cin >> rr;

// Изменяем параметры окружностей:

a.Set_x(xx);

a.Set_y(yy);

a.Set_r(rr);

cout << "Значение x=" << a.Get_x() << endl;

cout << "Значение y=" << a.Get_y() << endl;

cout << "Значение r=" << a.Get_r() << endl;

a.output(); // Пример использования вычислительных функций:

cout << "Площадь окружности:" << a.Area() << endl;

cout << "Длина окружности:" << a.Line() << endl;

_getch();

return 0;

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: