Доступ к данным и методам
Доступ к public (открытым) членам-данным возможен через оператор точка (.) : <имя_объекта> .<имя_члена-данного> .
// Пример 6.2.7
// Доступ к открытым членам простого класса
#include <iostream>
using namespace std;
// Объявление простейшего класса с открытыми данными-членами
class Cat {
public:
short itsAge; // возраст
double itsWeight; // вес
};
int main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
// Создание объектов стандартных типов
int a; // объект типа int с мусором внутри
cout << "a=\t" << a << endl;
cin.get();
int b=10; // проинициализированный объект типа int
cout << "b=\t" << b << endl;
cin.get();
int c=100,d=200; // несколько объктов типа int
cout << "c=\t" << c << "\td=\t" << d << endl;
cin.get();
// Создание объектов нестандартных типов
Cat Vaska; // Vaska - объект типа Cat с мусором внутри
cout << "Возраст кота Vaska = " << Vaska.itsAge << "\n";
cout << " Вес кота Vaska = " << Vaska.itsWeight << ".\n";
cin.get();
// доступ к public членам-данным через .
Vaska.itsAge=5;
Vaska.itsWeight=10.2;
cout << "Возраст кота Vaska = " << Vaska.itsAge << "\n";
cout << " Вес кота Vaska = " << Vaska.itsWeight << ".\n";
cin.get();
// Размер объекта
cout << "Размер объекта Vaska = " << sizeof(Cat) << endl;
cin.get();
// создание других объектов типа Cat в стековой памяти
Cat Murka, Borka; // Murka, Borka - объекты типа Cat с мусором внутри
cout << " Возраст кошки Murka = " << Murka.itsAge << "\n";
cout << "Вес кошки Murka = " << Murka.itsWeight << "\ n";
cout << " Возраст кота Borka = " << Borka.itsAge << " n";
cout << " Вес кота Borka = " << Borka.itsWeight << "\n";
cin.get(); cin.get();
return 0;
}
// Пример 6.2.8
// Создание и работа с объектами типа Pencil в стеке приложения
#include <iostream>
using namespace std;
typedef unsigned short int USHORT;
enum Color {Single, Red, Black, Green };
// Объявление класса
class Pencil {
public:
USHORT itsLength; // длина, мм
USHORT itsRadius; // радиус, мм
bool itsEraser; // наличие резинки
Color itsColor; // цвет
float itsPrice; // цена, гр.
char itsCaption[31]; // надпись
};
// главная функция
int main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
//создание первого объекта типа Pencil в стеке приложения
Pencil p1; // внутри мусор
cout << p1.itsLength << '\t' << p1.itsRadius << '\t' << p1.itsEraser << '\t'
<< p1.itsColor << '\t' << p1.itsPrice << '\t' << p1.itsCaption << endl;
cin.get();
// Определение свойств объекта p1 - set
p1.itsLength=200;
p1.itsRadius=10;
p1.itsEraser=true;
p1.itsColor=Single;
p1.itsPrice=0.3;
strcpy(p1.itsCaption,"Fantastic");
// Получение свойств объекта p1 - get
cout << p1.itsLength << '\t' << p1.itsRadius << '\t' << p1.itsEraser << '\t'
<< p1.itsColor << '\t' << p1.itsPrice << '\t' << p1.itsCaption << endl;
cin.get();
//создание второго и третьего объектов типа Pencil в стеке приложения
Pencil p2,p3; // внутри каждого из них мусор
cout << p2.itsLength << '\t' << p2.itsRadius << '\t' << p2.itsEraser << '\t'
<< p2.itsColor << '\t' << p2.itsPrice << '\t' << p1.itsCaption<< endl;
cout << p3.itsLength << '\t' << p3.itsRadius << '\t' << p3.itsEraser << '\t'
<< p3.itsColor << '\t' << p3.itsPrice << '\t' << p1.itsCaption<< endl;
cin.get();
// Определение свойств объекта p2 - set
p2.itsLength=50;
p2.itsRadius=10;
p2.itsEraser=false;
p2.itsColor=Red;
p2.itsPrice=0.5;
strcpy(p2.itsCaption,"Kohinor");
// Определение свойств объекта p3 - set
p3.itsLength=80;
p3.itsRadius=8;
p3.itsEraser=true;
p3.itsColor=Black;
p3.itsPrice=0.35;
strcpy(p3.itsCaption,"Konstructor");
// Получение свойств объекта p2 - get
cout << p2.itsLength << '\t' << p2.itsRadius << '\t' << p2.itsEraser << '\t'
<< p2.itsColor << '\t' << p2.itsPrice << endl;
// Получение свойств объекта p3 - get
cout << p3.itsLength << '\t' << p3.itsRadius << '\t' << p3.itsEraser << '\t'
<< p3.itsColor << '\t' << p3.itsPrice << endl;
cin.get();
// Обработка объектов - определение общей стоимости 3-х карандашей
double sum;
sum=p1.itsPrice+p2.itsPrice+p3.itsPrice;
cout << " Общая цена (SUM) = " << sum << endl;
cin.get();
// Обработка объектов - определение максимальной стоимости
double max;
(p1.itsPrice > p2.itsPrice) ? max = p1.itsPrice : max = p2.itsPrice;
( p3.itsPrice > max) ? max = p3.itsPrice : max;
cout << "Максимальная цена (MAX) = " << max << endl;
cin.get();
// Обработка объектов - определение количества карандашей с резинкой
short n=0;
if (p1.itsEraser) n++;
if (p2.itsEraser) n++;
if (p3.itsEraser) n++;
cout << "Число карандашей с резинкой = " << n << endl;
cin.get();
return 0; //... происходит уничтожение стековых объектов
}
12. Объявление класса и его реализация
Более сложные классы – это классы с открытыми членами-данными и функциями (методами). В них две части : объявление класса и реализация класса. В объявлении класса записываются данные-члены класса и прототипы функций-членов класса. Реализация функций класса располагается под объявлением класса. При этом определение каждой функции класса содержит тип возврата, полное имя функции (имени класса за которым следуют два двоеточия и имя функции) , список параметров и при необходимости ключевое слово const, которое гарантирует, что ни один оператор функции не сможет изменить значения любого члена-данного класса. Вызов public (открытых) членов-функций выполняется через оператор (.) : <имя_объекта> .<имя_члена-функции> .
// Пример 6.2.9
//Объявление и реализация классов
#include <iostream>
using namespace std;
//Объявление класса
class Cat {
//открытая часть класса
public:
// методы класса
void Meow();
void Jump(int);
// члены-данные
int itsAge;
};
//Реализация методов класса
void Cat::Meow() {
cout << "Мяу\n";
}
void Cat::Jump(int n) {
cout << "Число шагов в прыжке: " << n << " \n";
}
int main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
Cat Vaska; // создание объекта типа Cat с именем Vaska в стеке
Vaska.Meow(); // вызов метода Meow() для объекта Vaska
// вывод значения поля itsAge для объекта Vaska - мусор
cout << "Возраст кота Vaska = " << Vaska.itsAge << "\n";
Vaska.Jump(5); //вызов метода Jump(5) для объекта Vaska
Vaska.itsAge=7; //изменение поля itsAge для объекта Vaska
// вывод значения поля itsAge для объекта Vaska - 7
cout << "Возраст кота Vaska = " << Vaska.itsAge << "\n";
Vaska.Jump(-2); //вызов метода Jump(-2) для объекта Vaska
cin.get();
Cat Murka; //создание объекта типа Cat с именем Murka в стеке
// вывод значения поля itsAge для объекта Murka- мусор
cout << "Возраст кота Murka = " << Murka.itsAge << "\n";
cin.get();
return 0; //... происходит уничтожение стековых объектов
}
// Пример 6.2.10
//Объявление и реализация классов
#include <iostream>
using namespace std;
typedef unsigned short int USHORT;
enum Color {Single, Red, Black, Green };
// объявление класса
class Pencil {
public:
// члены-данные, свойства, поля (data members, properties, fields)
USHORT itsLength;
USHORT itsRadius;
bool itsEraser;
Color itsColor;
double itsPrice;
char itsCaption[31];
// члены-функции, методы (member-functions, methods)
void DisplayAllToScreen() const; // вывод полей класса на экран
void GetAllFromKeyBoard(); // ввод значений
};
// реализация класса
// вывод полей класса на экран
void Pencil::DisplayAllToScreen() const {
//itsLength=0; // нельзя - т.к. это константная функция
cout << "Длина : " << itsLength << endl
<< "Радиус : " << itsRadius << endl
<< "Резинка : " << itsLastic << endl
<< "Цвет : " << itsColor << endl
<< "Цена : " << itsPrice << endl
<< "Надпись : " << itsCaption << endl << endl << endl;
}
// ввод значений полей класса с клавиатуры
void Pencil::GetAllFromKeyBoard() {
USHORT color;
cout << "Введите длину, радиус, наличие резинки(0-1), цвет(0-3), "
<< " цену, надпись через пробел\n";
cin >> itsLength >> itsRadius >> itsEraser >> color
>> itsPrice >> itsCaption;
itsColor=(Color)color;
}
//главная функция
int main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
//создание первого объекта типа Pencil
Pencil p1;
p1.DisplayAllToScreen(); // вывод на экран - мусор
p1.GetAllFromKeyBoard(); // ввод с клавиатуры
p1.DisplayAllToScreen(); // вывод на экран
cin.get();
//создание второго объекта типа Pencil
Pencil p2;
p2.DisplayAllToScreen(); // вывод на экран - мусор
p2.GetAllFromKeyBoard(); // ввод с клавиатуры
p2.DisplayAllToScreen(); // вывод на экран
cin.get();
return 0; //... происходит уничтожение стековых объектов
}
13. Размещение класса в файлах
На практике описание одного класса размещают в двух внешних файлах. В первом (имеет обычно расширение hpp) находится объявление класса, а во втором (расширение cpp) - подключение оператором #includeобъявления класса и реализация методов класса. Объявление класса часто называют интерфейсом класса, поскольку из него программист может узнать о правилах работы с этим классом. Реализация методов класса представляет обычно интерес для автора класса или сопровождающего класс программиста.
// Пример 6.2.11 – одномодульный проект
//Объявление класса – файл Cat.h
class Cat {
//открытая часть класса
public:
// методы класса
void Meow();
void Jump(int);
// члены-данные
int itsAge;
};
//реализация класса – файл Cat.cpp
#include <iostream>
using namespace std;
// подключение объявления класса
#include "cat.h"
//Реализация методов класса
void Cat::Meow() {
cout << "Мяу\n";
}
void Cat::Jump(int n) {
cout << "Число шагов в прыжке: " << n << " \n";
}
// главная функция – файл main.cpp
#include <iostream>
using namespace std;
// реализация класса
#include "cat.cpp"
int main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
Cat Vaska; //создание объекта в стеке - мусор
cout << "Возраст кота Vaska = " << Vaska.itsAge << "\n";
Vaska.Jump(5);
Vaska.itsAge=7;
cout << "Возраст кота Vaska = " << Vaska.itsAge << "\n";
cin.get();
return 0; //... происходит уничтожение стековых объектов
}
14. Реализация функций в объявлении класса
Реализация коротких функций может быть записана непосредственно в объявлении класса. Подобные функции-члены класса имеют статус inline-функций.
// Пример 6.2.12
//Объявление и реализвция классов - inline функции
#include <iostream>
using namespace std;
//Объявление класса
class Cat {
//открытая часть класса
public:
// методы класса
void Meow(){cout << "Мяу\n";} // inline-функция (по умолчанию)
void Jump(int);
// члены-данные
int itsAge;
};
//Реализация класса – не inline-функция
void Cat::Jump(int n) {
cout << "Число шагов в прыжке: " << n << " \n";
}
int main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
Cat Vaska; //создание объекта в стеке - мусор
cout << "Возраст кота Vaska = " << Vaska.itsAge << "\n";
Vaska.Jump(5);
Vaska.itsAge=7;
cout << "Возраст кота Vaska = " << Vaska.itsAge << "\n";
cin.get();
return 0; //... происходит уничтожение стековых объектов
}