Министерство образования Республики Беларусь БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ Инженерно-экономический факультет Кафедра экономической информатики ОТЧЕТ По лабораторной работе №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; } Выводы: изучил основные принципы работы с классами и объектами, организацией ввода/вывода, динамическим выделением памяти в языке С++. Написал программу с их использованием.