Доступ к данным и методам

 

Доступ к 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; //... происходит уничтожение стековых объектов

}