Файл: Классы. Открытые и закрытые уровни доступа. Конструкторы. Инициализация данных объекта. Определение методов. Создание объекта в памяти. Стандартные потоки вводавывода.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.11.2023
Просмотров: 52
Скачиваний: 3
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Оглавление
ТЕМА 2
Вариант лабораторной работы 3
1.ТЕОРЕТИЧЕСКИЙ МАТЕРИАЛЛ 4
2.РАЗРАБОТКА ПРОГРАММЫ 8
3.ТЕСТИРОВАНИЕ ПРОГРАММЫ 15
Список использованных источников 16
ПРИЛОЖЕНИЕ А. КОД ФАЙЛА «MAIN.H» 17
ПРИЛОЖЕНИЕ Б. КОД ФАЙЛА «MAIN.CPP» 18
ТЕМА
Классы. Открытые и закрытые уровни доступа. Конструкторы. Инициализация данных объекта. Определение методов. Создание объекта в памяти. Стандартные потоки ввода-вывода.
Вариант лабораторной работы
Вариант №21
ДОГОВОР
номер — int
руководитель — char
сумма — float
Язык программирования: C++
Среда разработки: Visual Studio 2022
-
ТЕОРЕТИЧЕСКИЙ МАТЕРИАЛЛ
-
Типы данных C++
-
Язык C++ обладает набором фундаментальных типов, соответствующих базовым принципам организации компьютерной памяти и самым общим способам хранения данных:
-
Логический тип (bool) -
Символьные типы (такие как char) -
Целые типы (такие как int) -
Типы с плавающей запятой (такие как double)
Дополнительно, пользователь может объявить
-
Перечислимые типы для представления конечного набора значений (enum)
Также имеется
-
Тип void, указывающий на отсутствие информации
Поверх перечисленных типов можно строить следующие типы:
-
Указательные типы (такие как int*) -
Массивы (такие как char[]) -
Ссылочные типы (такие как doubles) -
Структуры данных и классы
-
Указатели и массивы
Для заданного типа Т, тип Т* является «указателем на Т». Это означает, что переменные типа Т* содержат адреса объектов типа Т Например:
char с = 'а';
char* р = &с; //р содержит адрес с
Указатели на массивы и указатели на функции требуют более сложных конструкций объявления:
int* pi; //указатель на int
char** ppc; // указатель на указатель на char
int* ap[15}; // массив из 15 указателей на int
int(*fp) (char*) ; //указатель на функцию с аргументом char* и возвратом int
int* f(char*); // функция с аргументом char* и возвратом "указатель на int"
Основной операцией над указателями является разыменование (dereferencing), то есть обращение к объекту, на который показывает указатель. Эту операцию также называют косвенным обращением (indirection). Унарная операция разыменования обозначается знаком *, применяемым префиксным образом по отношению к операнду. Например:
char с = 'а';
char* р = &с; //р содержит адрес переменной с
char с2 = *р; //с2 == 'а'
Указатель р показывает на переменную с, значением которой служит 'а'. Таким образом, значение выражения *р (присваиваемое с2) есть 'а'
Для заданного типа Т. тип T[size] является «массивом из size элементов типа Т». Индексация (нумерация) элементов требует индексов от 0 и до size-1. Например:
float v[3]; // массив из трех элементов типа float: v[0], v[l], v[2]
char* a[32] ; //массив из 32 указателей на char: а[0] .. а[31]
Количество элементов массива (размер массива) должно задаваться константным выражением. Если же нужен массив переменного размера, необходимо использовать тип vector.
Многомерные массивы определяются как массивы массивов. Пример:
int d2 [10][20] ; //d2 есть массив из 10 массивов по 20 целых в каждом
Массив можно проинициализировать списком значений. Например:
int v[] = {1,2,3,4};
char v2[] = {'a', 'b', ' с',0};
Когда массив объявляется без явного указания размера, но со списком инициализирующих значений, размер вычисляется по количеству этих значений. Следовательно, v1 и v2 имеют типы int[4] и char [4], соответственно.
-
Функции
Объявление функции (function declaration) предоставляет ее имя, тип возвращаемого значения (если оно есть), а также число и типы аргументов, которые требуется передавать функции при ее вызове. Например:
Elem* next_elem();
char* strcpy(char* to, const char* from);
void exit(int);
Семантика передачи аргументов идентична семантике инициализации. Производится проверка типов аргументов и при необходимости выполняется неявное приведение типов. Например:
double sqrt(double);
double sr2=sqrt(2) ; //вызов sqrt() с аргументом double(2)
Определение функции (function definition) есть ее объявление плюс тело функции. Например:
extern void swap (int*, int*); //объявление
void swap (int* p, int* q) //определение
{
int t=*p;
*p = *q;
*q = t;
}
Все типы в определении функции и ее объявлениях обязаны совпадать.
-
Классы
Класс — этот тип, определяемый пользователем.
Тело класса разбито на три части, соответствующие трем атрибутам:
class имя
{
private:
…
protected:
…
public:
…
};
Атрибут private имеют члены класса, доступные только для составных и дружественных функций этого класса. Эти члены класса называются закрытыми.
Атрибут protected имеют члены класса, доступные для составных и дружественных функций классов, которые являются производными от этого класса или совпадают с ним. Эти члены класса называются защищенными.
Атрибут public имеют члены класса, обращение к которым осуществляется как к полям структуры. Эти члены называются открытыми.
Если первичный класс объявлен с ключевым словом class, то первые его члены будут закрытыми по умолчанию, если как stuct, то открытыми. В случае union члены класса могут быть только открытыми
Составная функция класса, вызываемая при создании объекта, называется конструктором.
Основные свойства конструктора:
-
Класс может иметь несколько конструкторов. Имя каждого конструктора совпадает с именем класса, для которого этот конструктор определен. Конструкторы могут быть перегружены и иметь параметры по умолчанию. -
Конструктор не имеет возвращаемого значения. -
Конструктор может быть объявлен и в закрытой, и в защищенной, и в открытой части класса. Если конструктор объявлен в закрытой части, то объекты этого класса могут создаваться только дружественными функциями, а если в защищенной — дружественными функциями производного класса. -
Конструктор может быть определен вне тела класса. -
Обращение к конструктору осуществляется одним из трех способов:
-
имя объект(параметры); -
имя объект = имя(параметры); -
имя объект = параметр;
где имя обозначает имя класса. Второй способ называется явным, третий — сокращенным.
-
РАЗРАБОТКА ПРОГРАММЫ
Проект программы состоит из двух файлов:
-
Заголовочный файл «main.h» -
Файл исходного кода «main.cpp»
-
Подключение заголовочных файлов в файле main.cpp
#include
#include
#include
#include
#include "main.h"
-
Объявление класса в заголовочном
class Contract { //Класс "Договор"
private:
int number; //Номер договора
char contractor[100]; //Подрядчик
char nameOfManager[100]; //Фамилия руководителя
float sum; //Сумма
};
Данные класса имеют закрытый уровень доступа (private).
-
Методы get
Метод «get» предназначен для обращения к объекту и получению значения переменной.
Прототипы методов get в заголовочном файле «main.h»
class Contract { //Класс "Договор"
private:
…
public:
…
//Методы Get
int get_number(void);
const char* get_contractor(void);
const char* get_nameOfManager(void);
float get_sum(void);
…
};
Реализация методов «get» в файле «main.cpp»
#include …
// Методы Get
int Contract::get_number(void) { //Получение номера договора
return number;
}
const char* Contract::get_contractor(void) { //Получение наименования подрядчика
return contractor;
}
const char* Contract::get_nameOfManager(void) { //Получение ФИО руководителя
return nameOfManager;
}
float Contract::get_sum(void) { //Получение суммы договора
return sum;
}
int main() {
…
return 0;
}
-
Методы set
Метод «set» предназначается для изменения данных в объекте.
Прототипы методов «get» в заголовочном файле «main.h»
class Contract { //Класс "Договор"
private:
…
public:
…
//Методы Set
void set_number(int iNum);
void set_contractor(const char* cCon);
void set_nameOfManager(const char* cNOM);
void set_sum(float fSum);
…
};
Реализация методов «set» в файле «main.cpp»
#include …
//Методы Set
void Contract::set_number(int iNum) { //Ввод номера договора
number = iNum;
}
void Contract::set_contractor(const char* cCon) { //Ввод наименования подрядчика
strcpy(contractor, cCon);
}
void Contract::set_nameOfManager(const char* cNOM) { //Ввод ФИО руководителя
strcpy(nameOfManager, cNOM);
}
void Contract::set_sum(float fSum) { //Ввод суммы договора
sum = fSum;
}int main() {
…
return 0;
}
-
Функция ввода данных в объект с клавиатуры Input()
Прототип функции в заголовочном файле «main.h»
class Contract { //Класс "Договор"
private:
…
public:
…
void Input(); //Ввод данных
};
Реализация функции в файле «main.cpp»
#include …
…
void Contract::Input(void) { //Ввод данных
cout << "Введите данные" << endl;
cout << "Номер договора: ";
int inNum;
cin >> inNum;
Contract::set_number(inNum);
cin.get();
cout << "Подрядчик: ";
char inCon[100];
cin.getline(inCon, 100);
Contract::set_contractor(inCon);
cout << "Руководитель: ";
char inMan[100];
cin.getline(inMan, 100);
Contract::set_nameOfManager(inMan);
cout << "Сумма договора: ";
float inSum;
cin >> inSum;
Contract::set_sum(inSum);
}
int main() {
…
return 0;
}
-
Функция вывода данных в консоль Print()
Прототип функции в заголовочном файле «main.h»
class Contract { //Класс "Договор"
private:
…
public:
…
void Print(); //Ввод данных
};
Реализация функции в файле «main.cpp»
#include …
…
void Contract::Print(void) { //Вывод данных
cout << std::endl;
cout << "Номер договора: " << get_number() << endl;
cout << "Подрядчик: " << get_contractor() << endl;
cout << "Руководитель: " << get_nameOfManager() << endl;
cout << "Сумма договора: " << get_sum() << endl;
}
…
int main() {
…
return 0;
}
-
Конструктор объекта по умолчанию (без аргументов)
Прототип конструктора без аргументов в заголовочном файле:
class Contract { //Класс "Договор"
private:
…
public:
Contract(); //Прототип конструктора
…
};
Определение конструктора по умолчанию в файле «main.cpp»
#include …
Contract::Contract(void) ://Конструктор по умолчанию
number(1),
contractor(),
nameOfManager(),
sum(100.5)
{
strcpy(contractor, "Название подрядчика по умолчанию");
strcpy(nameOfManager, "ФИО руководителя по умолчанию");
}
…
int main() {
…
return 0;
}
Создание объекта «icon» с помощью конструктора по умолчанию и вывод его данных в консоль
#include …
Contract::Contract(void) ://Конструктор по умолчанию
number(1),
contractor(),
nameOfManager(),
sum(100.5)
{
strcpy(contractor, "Название подрядчика по умолчанию");
strcpy(nameOfManager, "ФИО руководителя по умолчанию");
}
…
int main() {
…
cout << "/////Объект созданный конструктором по умолчанию/////" << endl;
Contract icon;
icon.Print();
…
return 0;
}
Создание объекта «icon2» с помощью конструктора по умолчанию, изменение его данных с помощью методов «set» и вывод его данных в консоль
#include …
Contract::Contract(void) ://Конструктор по умолчанию
number(1),
contractor(),
nameOfManager(),
sum(100.5)
{
strcpy(contractor, "Название подрядчика по умолчанию");
strcpy(nameOfManager, "ФИО руководителя по умолчанию");
}
…
int main() {
…
cout << endl << "/////Объект созданный конструктором по умолчанию и изменённый с помощью set/////" << endl;
Contract icon2;
icon2.set_number(2);
icon2.set_contractor("ИП Иванов И.И.");
icon2.set_nameOfManager("Иванов иван иванович");
icon2.set_sum(200.5);
icon2.Print();
…
return 0;
}
-
Конструктор объекта, аргументы которого инициализируют все данные объекта.
Прототип конструктора с аргументами в заголовочном файле:
class Contract { //Класс "Договор"
private:
…
public:
…
Contract(int inNum, const char* inCon, const char* inNOM, float inSum);
…
};
Определение конструктора с аргументами в файле «main.cpp»
#include …
Contract::Contract(int inNum, const char* inCon, const char* inNOM, float inSum) {
set_number(inNum);
set_contractor(inCon);
set_nameOfManager(inNOM);
set_sum(inSum);
}…
int main() {
…
return 0;
}
Создание объекта «icon3» с помощью конструктора, аргументы которого инициализируют все данные объекта и вывод его данных в консоль
#include …
Contract::Contract(int inNum, const char* inCon, const char* inNOM, float inSum) {
set_number(inNum);
set_contractor(inCon);
set_nameOfManager(inNOM);
set_sum(inSum);
}…
…
int main() {
…
cout << endl << "/////Объект созданный конструктором с аргументами/////" << endl;
Contract icon3(3, "Название по умолчанию", "ФИО руководителя по умолчанию", 100.5);
icon3.Print();
…
return 0;
}
-
Создайте динамический объект «icon4» с помощь оператора «new».
#include …
Contract::Contract(void) ://Конструктор по умолчанию
number(1),
contractor(),
nameOfManager(),
sum(100.5)
{
strcpy(contractor, "Название подрядчика по умолчанию");
strcpy(nameOfManager, "ФИО руководителя по умолчанию");
}
…
int main() {
…
cout << endl << "/////Создание динамического объекта/////" << endl;
Contract* icon4 = new Contract; //Динамический объект
icon4->set_number(4);
icon4->set_contractor("ОАО Новое Время");
icon4->set_nameOfManager("Временьщиков Игорь Васильевич");
icon4->set_sum(200.4);
icon4->Print();
delete icon4; //Удаление динамического объекта
…
return 0;
}
-
Создание объекта «icon5», данные которого вводит пользователь с помощью консоли
#include …
Contract::Contract(void) ://Конструктор по умолчанию
number(1),
contractor(),
nameOfManager(),
sum(100.5)
{
strcpy(contractor, "Название подрядчика по умолчанию");
strcpy(nameOfManager, "ФИО руководителя по умолчанию");
}
…
int main() {
…
cout << endl << "/////Объект созданный конструктором по умолчанию и данными введёнными пользователем/////" << endl;
Contract icon5;
icon5.Input();
icon5.Print();
…
return 0;
}
-
ТЕСТИРОВАНИЕ ПРОГРАММЫ
При запуске программы создаются все объекты, данные первых 4-х объектов выводятся в консоль, после этого программа ожидает ввода данных последнего объекта.
После ввода пользователем данных объекта, данные выводятся на экран
Программа завершилась без ошибок и ожидает нажатие любой клавиши для завершения.
Список использованных источников
-
Катаев М.Ю. Объектно-ориентированное программирование: учебное пособие /М. Ю. Катаев. — Томск: Эль Контент, 2013. — 212 с. -
Катаев М.Ю. Объектно-ориентированное программирование: лабораторный практикум. — Томск: Факультет дистанционного обучения, ТУСУР, 2014. — 53 с. -
Бьерн Страуструп. Язык программирования C++. Специальное издание. Пер. с англ. —М.: Издательский дом Бином, 2019 г. — 1136 с.: ил.
ПРИЛОЖЕНИЕ А. КОД ФАЙЛА «MAIN.H»
#pragma once
class Contract { //Класс "Договор"
private:
int number; //Номер договора
char contractor[100]; //Подрядчик
char nameOfManager[100]; //Фамилия руководителя
float sum; //Сумма
public:
Contract(); //Прототип конструктора
Contract(int inNum, const char* inCon, const char* inNOM, float inSum);
//Методы Get
int get_number(void);
const char* get_contractor(void);
const char* get_nameOfManager(void);
float get_sum(void);
//Методы Set
void set_number(int iNum);
void set_contractor(const char* cCon);
void set_nameOfManager(const char* cNOM);
void set_sum(float fSum);
//
void Print(); //Вывод данных
void Input(); //Ввод данных
};
ПРИЛОЖЕНИЕ Б. КОД ФАЙЛА «MAIN.CPP»
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include "main.h"
using namespace std;
Contract::Contract(void) ://Конструктор по умолчанию
number(1),
contractor(),
nameOfManager(),
sum(100.5)
{
strcpy(contractor, "Название подрядчика по умолчанию");
strcpy(nameOfManager, "ФИО руководителя по умолчанию");
}
Contract::Contract(int inNum, const char* inCon, const char* inNOM, float inSum) {
set_number(inNum);
set_contractor(inCon);
set_nameOfManager(inNOM);
set_sum(inSum);
}
// Методы Get
int Contract::get_number(void) { //Получение номера договора
return number;
}
const char* Contract::get_contractor(void) { //Получение наименования подрядчика
return contractor;
}
const char* Contract::get_nameOfManager(void) { //Получение ФИО руководителя
return nameOfManager;
}
float Contract::get_sum(void) { //Получение суммы договора
return sum;
}
//Методы Set
void Contract::set_number(int iNum) { //Ввод номера договора
number = iNum;
}
void Contract::set_contractor(const char* cCon) { //Ввод наименования подрядчика
strcpy(contractor, cCon);
}
void Contract::set_nameOfManager(const char* cNOM) { //Ввод ФИО руководителя
strcpy(nameOfManager, cNOM);
}
void Contract::set_sum(float fSum) { //Ввод суммы договора
sum = fSum;
}
void Contract::Print(void) { //Вывод данных
cout << std::endl;
cout << "Номер договора: " << get_number() << endl;
cout << "Подрядчик: " << get_contractor() << endl;
cout << "Руководитель: " << get_nameOfManager() << endl;
cout << "Сумма договора: " << get_sum() << endl;
}
void Contract::Input(void) { //Ввод данных
cout << "Введите данные" << endl;
cout << "Номер договора: ";
int inNum;
cin >> inNum;
Contract::set_number(inNum);
cin.get();
cout << "Подрядчик: ";
char inCon[100];
cin.getline(inCon, 100);
Contract::set_contractor(inCon);
cout << "Руководитель: ";
char inMan[100];
cin.getline(inMan, 100);
Contract::set_nameOfManager(inMan);
cout << "Сумма договора: ";
float inSum;
cin >> inSum;
Contract::set_sum(inSum);
}
int main() {
SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода
cout << "/////Объект созданный конструктором по умолчанию/////" << endl;
Contract icon;
icon.Print();
cout << endl << "/////Объект созданный конструктором по умолчанию и изменённый с помощью set/////" << endl;
Contract icon2;
icon2.set_number(2);
icon2.set_contractor("ИП Иванов И.И.");
icon2.set_nameOfManager("Иванов иван иванович");
icon2.set_sum(200.5);
icon2.Print();
cout << endl << "/////Объект созданный конструктором с аргументами/////" << endl;
Contract icon3(3, "Название по умолчанию", "ФИО руководителя по умолчанию", 300.5);
icon3.Print();
cout << endl << "/////Создание динамического объекта/////" << endl;
Contract* icon4 = new Contract; //Динамический объект
icon4->set_number(4);
icon4->set_contractor("ОАО Новое Время");
icon4->set_nameOfManager("Временьщиков Игорь Васильевич");
icon4->set_sum(400.5);
icon4->Print();
delete icon4; //Удаление динамического объекта
cout << endl << "/////Объект созданный конструктором по умолчанию и данными введёнными пользователем/////" << endl;
Contract icon5;
icon5.Input();
icon5.Print();
system("pause");
return 0;
}