Uploaded by _moon rock

ClassesAndObjects

advertisement
Министерство образования Республики Беларусь
БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ
Инженерно-экономический факультет
Кафедра экономической информатики
ОТЧЕТ
По лабораторной работе №1
«КЛАССЫ И ОБЪЕКТЫ. ОРГАНИЗАЦИЯ ВВОДА/ВЫВОДА.
ДИНАМИЧЕСКОЕ ВЫДЕЛЕНИЕ ПАМЯТИ В ЯЗЫКЕ С++»
Вариант 21
Выполнила:
студент группы 273602
Карпейчик ЛЕША
Проверил:
Салапура М. Н.
старший преподаватель, магистр
экономических наук
Минск 2022
Цель: изучить структуру класса, атрибуты доступа к компонентам класса;
рассмотреть принцип работы конструкторов (с параметрами, без параметров,
с параметрами по умолчанию, конструктора копирования), деструкторов при
работе с объектом, статические и константные данные и методы класса.
Краткие теоретические сведения
Класс – это абстракция, это тип данных, определяемый пользователем.
Объявление класса начинается с ключевого слова class.
Различные структуры могут иметь методы с одинаковыми именами, то при
описании метода необходимо указывать, к какой структуре он относится с
помощью оператора принадлежности «::». Оператор принадлежности «::»
иначе называется оператором разрешения области видимости (оператором
разрешения контекста). Это оператор самого высокого приоритета.
Обычно данные класса имеют атрибут доступа private или protected, а методы
– public. Значения атрибутов доступа
− private – элемент класса с атрибутом private может использоваться только
методами собственного класса и функциями-«друзьями» этого же класса; по
умолчанию все элементы класса, объявленного с ключевым словом class,
имеют атрибут доступа private;
− protected – тот же доступ, что и private, но дополнительно элемент класса
может использоваться методами и функциями-«друзьями» производного
класса, для которого данный класс является базовым;
− public – элемент класса может использоваться любым компонентом
программы, т. е. защита на доступ к элементу снимается.
Конструктор является элементом класса и имеет точно такое же имя, что и
класс. Конструктор может быть без аргументов, с аргументами. Конструктор
никогда не возвращает значение (перед именем конструктора не стоит даже
тип void).
Конструктор, у которого все аргументы заданы по умолчанию, называется
конструктором по умолчанию, т. е. конструктором, который можно
вызывать без указания каких-либо аргументов. Для каждого класса может
существовать только один конструктор по умолчанию.
Конструктор копии вызывается в случае, когда один объект
инициализирует другой.
Противоположные действия, по отношению к действиям конструктора,
выполняет метод-деструктор или метод-разрушитель, который уничтожает
объект. Деструктор может вызываться явно или неявно. Неявный вызов
деструктора связан с прекращением существования объекта из-за завершения
его области видимости. Явное уничтожение объекта требует явного вызова
деструктора, как и любого другого метода класса. Деструктор имеет то же
имя, что и класс, но перед именем деструктора записывается знак тильда «~».
Деструктор не может иметь аргументы, возвращать значение и
наследоваться.
Подобно конструкторам деструкторы не возвращают значений,
следовательно, в их объявлениях отсутствует тип возвращаемого значения. В
отличие от конструкторов, деструкторы не могут иметь параметров и не
могут быть перегружены.
Индивидуальное задание
. Создать класс String (строка). Разработать в классе методы для работы
со строками: concat (объединяет строки, может объединять две и более
строк), concat_ws (объединяет строки, но в качестве первого параметра
принимает разделитель, который будет соединять строки), length
(возвращает количество символов в строке), ltrim (удаляет начальные
пробелы в строке), rtrim (удаляет конечные пробелы в строке).
Использовать конструктор с параметрами, конструктор без параметров,
конструктор копирования. В класс добавить необходимый набор полей и
методов (минимум два поля и два метода) на свое усмотрение.
Предусмотреть метод для записи полученных данных в файл.
Код программы:
Код класса String.cpp:
#include <iostream>
#include <vector>
#include <fstream>
#include "string.h"
using namespace std;
String::String() : str("") {}
String::String(string s) : str(s) {}
String::String(const String& other) : str(other.str) {}
int String::length() const {
return str.length();
}
String String::ltrim() const {
string s = str;
s.erase(s.begin(), find_if(s.begin(), s.end(), [](int ch) {
return !isspace(ch);
}));
return s;
}
String String::rtrim() const {
string s = str;
s.erase(find_if(s.rbegin(), s.rend(), [](int ch) {
return !isspace(ch);
}).base(), s.end());
return s;
}
String String::concat(const String& other) const {
return str + other.str;
}
String String::concat_ws(const string& sep, const vector<String>& others) const {
string s;
for (int i = 0; i < others.size(); i++) {
if (i > 0) s += sep;
s += others[i].str;
}
return s;
}
void String::write_to_file(const string& filename) const {
ofstream outfile(filename);
if (outfile.is_open()) {
outfile << str;
outfile.close();
}
else {
cerr << "Error: cannot open file " << filename << endl;
}
}
ostream& operator<<(ostream& os, const String& s) {
os << s.str;
return os;
}
Код заголовочного файла String.h
#ifndef STRING_H
#define STRING_H
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
class String {
private:
std::string str;
public:
String();
String(std::string s);
String(const String& other);
int length() const;
String ltrim() const;
String rtrim() const;
String concat(const String& other) const;
String concat_ws(const std::string& sep, const std::vector<String>& others) const;
void write_to_file(const std::string& filename) const;
friend std::ostream& operator<<(std::ostream& os, const String& s);
};
#endif // STRING_H
Код файла StringRunner.cpp
#include <iostream>
#include "string.h"
using namespace std;
int main() {
int choice;
cout << "String Manipulator" << endl;
cout << "1. Concatenate two strings" << endl;
cout << "2. Concatenate multiple strings with a separator" << endl;
cout << "3. Get length of a string" << endl;
cout << "4. Remove leading spaces from a string" << endl;
cout << "5. Remove trailing spaces from a string" << endl;
cout << "6. Writing to file" << endl;
cout << "Enter your choice (1-5): ";
cin >> choice;
switch (choice) {
case 1:
{
string s1, s2;
cout << "Enter the first string: ";
cin >> s1;
cout << "Enter the second string: ";
cin >> s2;
String str1(s1), str2(s2);
String result = str1.concat(str2);
cout << "Result: " << result << endl;
break;
}
case 2:
{
int count;
cout << "How many strings do you want to concatenate? ";
cin >> count;
vector<String> strings;
for (int i = 0; i < count; i++) {
string s;
cout << "Enter string " << i + 1 << ": ";
cin >> s;
strings.push_back(String(s));
}
string separator;
cout << "Enter the separator: ";
cin >> separator;
String string;
String result = string.concat_ws(separator, strings);
cout << "Result: " << result << endl;
break;
}
case 3:
{
string s;
cout << "Enter the string: ";
cin >> s;
String str(s);
int length = str.length();
cout << "Length: " << length << endl;
break;
}
case 4:
{
string s;
cout << "Enter the string: ";
cin >> s;
String str(s);
String result = str.ltrim();
cout << "Result: " << result << endl;
break;
}
case 5:
{
string s;
cout << "Enter the string: ";
cin >> s;
String str(s);
String result = str.rtrim();
cout << "Result: " << result << endl;
break;
}
case 6:
{
String string;
cout << "Enter the string: ";
string.write_to_file("test.txt");
}
default:
cout << "Invalid choice." << endl;
break;
}
return 0;
}
Выводы: изучил основные принципы работы с классами и объектами,
организацией ввода/вывода, динамическим выделением памяти в языке С++.
Написал программу с их использованием.
Download