6.   Класове

До сега за класовете:
Employee harry("Hacher, Harry", 350);
harry.set_salary(380);
cout << harry.get_name();



Обособяване на класове

Чете се информация за компютри, съдържаща:
 

име на модел name OmniBook XE
цена price 5660
оценка score 76

Търси се продукта с най-голямо отношение оценка/цена.

#include <iostream>
#include <string>
using namespace std;

int main()
{  string best_name = "";
   double best_price = 0;
   int best_score = 0;

   bool more = true;
   while (more)
   {  string next_name;
      double next_price;
      int next_score;

      cout << "Please enter the model name: ";
      getline(cin, next_name);
      cout << "Please enter the price: ";
      cin >> next_price;
      cout << "Please enter the score: ";
      cin >> next_score;
      string remainder; /* read remainder of line */
      getline(cin, remainder);

      if (next_price != 0)
      {  if (best_price == 0 or
            next_score/next_price > best_score/best_price)
         {  best_name = next_name;
            best_score = next_score;
            best_price = next_price;
         }
      }
      cout << "More data? (y/n) ";
      string answer;
      getline(cin, answer);
      if (answer != "y") more = false;
   }
   cout << "The best bang for the buck is " << best_name
      << " (Score: " << best_score
      << " Price: " << best_price << ")\n";
   return 0;
}



  Интерфейс и капсулиране

#include <iostream>
#include <string>
using namespace std;

class Product  {
public:   /*интерфейс*/
   Product();                /*създава нов продукт*/
   void read();                     /*чете продукт*/
   bool is_better_than(Product b) const;/*сравнява*/
   void print() const;                 /*отпечатва*/
private:  /*капсулиране*/
   string name;                     /*скрити данни*/
   double price;                    /*скрити данни*/
   int score;                       /*скрити данни*/
};

int main()
{  Product best;

   bool more = true;
   while (more)
   {  Product next;
      next.read();
      if (next.is_better_than(best)) best = next;

      cout << "More data? (y/n) ";
      string answer;
      getline(cin, answer);
      if (answer != "y") more = false;
   }
   cout << "The best bang for the buck is ";
   best.print();
   return 0;
}



Членове-функции

* конструктор
Product::Product() {  price = 0;   score = 0; }

* мутатори (set-функции)
void Product::read()
{  cout << "Please enter the model name: ";
   getline(cin, name);
   cout << "Please enter the price: ";
   cin >> price;
   cout << "Please enter the score: ";
   cin >> score;
   string remainder;
   getline(cin, remainder); }

* функции за достъп (get-функции)
bool Product::is_better_than(Product b) const
{  if (price == 0) return false;
    if (b.price == 0) return true;
    if (score/price > b.score/b.price) return true;
    return false;   }

void Product::print() const
{  cout << name
        << " Price: " << price
        << " Score: " << score << "\n";  }

* Неявен параметър на член-функция



Конструктори по подразбиране и с параметри

* Конструкторът инициализира полетата данни на обекта

* Предефиниране на функции
class Employee {
public:
   Employee();
   Employee(string emp_name, double init_salary);
   void set_salary(double new_salary);
   string get_name() const;
   double get_salary() const;
   void print() const;
private:
   string name;
   double salary;
};

Employee::Employee(string emp_name, double init_salary)
{ name = emp_name;
  salary = init_salary;  }



Достъп до полетата с данни

 * Само членовете-функции имат достъп до скритите полета с данни
   string get_name() const   { return name; }

   double get_salary() const { return salary; }

* Явни и неявни параметри на функции
-- член-функция с използване на достъпът до скритите данни
void Employee::print() const
{ cout << "Name: " << name << "    "
       << "Salary: " << salary << "\n"; }
-- член-функция с използване на член-функции от същия клас
void Employee::print() const
{ cout << "Name: " << get_name() << "    "
       << "Salary: " << get_salary() << "\n"; }
-- външна за класа функция
void print(Employee const &emp)
{ cout << "Name: " << emp.get_name() << "    "
       << "Salary: " << emp.get_salary() << "\n"; }