Файл: Классы. Открытые и закрытые уровни доступа. Конструкторы. Инициализация данных объекта. Определение методов. Создание объекта в памяти. Стандартные потоки вводавывода.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
  1. ТЕОРЕТИЧЕСКИЙ МАТЕРИАЛЛ


    1. Типы данных C++

Язык C++ обладает набором фундаментальных типов, соответствующих базовым принципам организации компьютерной памяти и самым общим способам хранения данных:

  • Логический тип (bool)

  • Символьные типы (такие как char)

  • Целые типы (такие как int)

  • Типы с плавающей запятой (такие как double)

Дополнительно, пользователь может объявить

  • Перечислимые типы для представления конечного набора значений (enum)

Также имеется

  • Тип void, указывающий на отсутствие информации

Поверх перечисленных типов можно строить следующие типы:

  • Указательные типы (такие как int*)

  • Массивы (такие как char[])

  • Ссылочные типы (такие как doubles)

  • Структуры данных и классы



    1. Указатели и массивы

Для заданного типа Т, тип Т* является «указателем на Т». Это означает, что переменные типа Т* содержат адреса объектов типа Т Например:

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], соответственно.

    1. Функции

Объявление функции (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;

}

Все типы в определении функции и ее объявлениях обязаны совпадать.

    1. Классы

Класс — этот тип, определяемый пользователем.

Тело класса разбито на три части, соответствующие трем атрибутам:

class имя

{

private:



protected:



public:



};

Атрибут private имеют члены класса, доступные только для составных и дружественных функций этого класса. Эти члены класса называются закрытыми.

Атрибут protected имеют члены класса, доступные для составных и дружественных функций классов, которые являются производными от этого класса или совпадают с ним. Эти члены класса называются защищенными.



Атрибут public имеют члены класса, обращение к которым осуществляется как к полям структуры. Эти члены называются открытыми.

Если первичный класс объявлен с ключевым словом class, то первые его члены будут закрытыми по умолчанию, если как stuct, то открытыми. В случае union члены класса могут быть только открытыми

Составная функция класса, вызываемая при создании объекта, называется конструктором.

Основные свойства конструктора:

  • Класс может иметь несколько конструкторов. Имя каждого конструктора совпадает с именем класса, для которого этот конструктор определен. Конструкторы могут быть перегружены и иметь параметры по умолчанию.

  • Конструктор не имеет возвращаемого значения.

  • Конструктор может быть объявлен и в закрытой, и в защищенной, и в открытой части класса. Если конструктор объявлен в закрытой части, то объекты этого класса могут создаваться только дружественными функциями, а если в защищенной — дружественными функциями производного класса.

  • Конструктор может быть определен вне тела класса.



Обращение к конструктору осуществляется одним из трех способов:

  • имя объект(параметры);

  • имя объект = имя(параметры);

  • имя объект = параметр;

где имя обозначает имя класса. Второй способ называется явным, третий — сокращенным.
  1. РАЗРАБОТКА ПРОГРАММЫ


Проект программы состоит из двух файлов:

  • Заголовочный файл «main.h»

  • Файл исходного кода «main.cpp»



    1. Подключение заголовочных файлов в файле main.cpp

#include

#include

#include

#include

#include "main.h"


    1. Объявление класса в заголовочном

class Contract { //Класс "Договор"
private:

int number; //Номер договора

char contractor[100]; //Подрядчик

char nameOfManager[100]; //Фамилия руководителя

float sum; //Сумма

};

Данные класса имеют закрытый уровень доступа (private).

    1. Методы 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;

}

    1. Методы 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;

}

    1. Функция ввода данных в объект с клавиатуры 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;

}

    1. Функция вывода данных в консоль 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;

}

    1. Конструктор объекта по умолчанию (без аргументов)

Прототип конструктора без аргументов в заголовочном файле:

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;

}

    1. Конструктор объекта, аргументы которого инициализируют все данные объекта.

Прототип конструктора с аргументами в заголовочном файле:

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;

}

    1. Создайте динамический объект «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;

}

    1. Создание объекта «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;

}
  1. ТЕСТИРОВАНИЕ ПРОГРАММЫ


При запуске программы создаются все объекты, данные первых 4-х объектов выводятся в консоль, после этого программа ожидает ввода данных последнего объекта.



После ввода пользователем данных объекта, данные выводятся на экран



Программа завершилась без ошибок и ожидает нажатие любой клавиши для завершения.

Список использованных источников




  1. Катаев М.Ю. Объектно-ориентированное программирование: учебное пособие /М. Ю. Катаев. — Томск: Эль Контент, 2013. — 212 с.

  2. Катаев М.Ю. Объектно-ориентированное программирование: лабораторный практикум. — Томск: Факультет дистанционного обучения, ТУСУР, 2014. — 53 с.

  3. Бьерн Страуструп. Язык программирования 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;

}