CPP-101: Класове и обекти

Пример: Точка от равнината

Нека дефинираме клас Point, който моделира точка в равнината така, както е описано в раздел Примери:Точка в равнината.

Класът Point ще има две член-променливи x_ и y_ от типа double, които са декартовите координати на точката в равнината. Член-променливите са дефинирани в скритата част на класа. За да имаме достъп до стойностите на тези променливи дефинираме две двойки методи:

  • get_x() и get_y(), които връщат текущите стойности на x и y-координатата на точката съответно;
  • set_x() и set_y(), които задават нови стойности на координатите на точката.
#include<iostream>
using namespace std;

class Point {
    double x_, y_;
public:
    double get_x() {return x_;}
    double get_y() {return y_;}
    void set_x(double x) {x_=x;}
    void set_y(double y) {y_=y;}

    Point(double x=0.0, double y=0.0) {
        x_=x;
        y_=y;
    }
    ...
};

Дефинираме и конструктор за класа Point, който приема два аргумента – декартовите координати на създаваната точка. Обърнете внимание, че и двата аргумента на конструктора имат стойности по подразбиране. Това позволява конструкторът да се вика без да му се предават аргументи, т.е. този конструктор може да работи и като конструктор по подразбиране.

Като член-функции на класа реализираме и операциите събиране и изваждане на точки от равнината. Член-функцията add получава като аргумент точка от равнината и я добавя към обекта, чрез който е извикана.

void add(Point other) {
    x_+=other.x_;
    y_+=other.y_;
}

Аналогично работи функцията sub, която намира разликата между две точки.

void sub(Point other) {
    x_-=other.x_;
    y_-=other.y_;
}

Като пример за използването на обекти от класа Point нека разгледаме функцията add:

Point add(Point p1, Point p2) {
    Point result(p1.get_x(),p1.get_y());
    result.add(p2);
    return result;
}

Тази функция приема като аргументи две променливи от типа Point, изчислява тяхната сума и връща резултата. В ред 2 се създава временна променлива result от типа Point, която се инициализира така, че нейните координати да са равни на координатите на първия аргумент p1. След това, в ред 3, към точката result се добавя точката p2. Следователно променливата result съдържа резултата от събирането на двете точки, предадени като аргументи на функцията – p1 и p2.

Целият код на примерната програма е представен в следващия фрагмент:

#include <iostream>
using namespace std;

class Point {
    double x_, y_;
public:
    double get_x() {return x_;}
    double get_y() {return y_;}
    void set_x(double x) {x_=x;}
    void set_y(double y) {y_=y;}

    Point(double x=0.0, double y=0.0) {
        x_=x;
        y_=y;
    }

    void add(Point other) {
        x_+=other.x_;
        y_+=other.y_;
    }

    void sub(Point other) {
        x_-=other.x_;
        y_-=other.y_;
    }

    double distance(Point other) {
        double dx=x_-other.x_;
        double dy=y_-other.y_;
        return sqrt(dx*dx+dy*dy);
    }
};

Point add(Point p1, Point p2) {
    Point result(p1.get_x(),p1.get_y());
    result.add(p2);
    return result;
}

Point sub(Point p1, Point p2) {
    Point result(p1.get_x(), p2.get_y());
    result.sub(p2);
    return result;
}

double distance(Point p1, Point p2) {
    return p1.distance(p2);
}
Публикувано в CPP-101, ООП с етикети , , . Постоянна връзка.