Добавил:
Рад, если кому-то помог Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
01.11.2025
Размер:
3.14 Кб
Скачать
#include <iostream>
#include <cstring>
#include <windows.h>
using namespace std;

class my_str {
private:
    size_t len;
    char* str;
    
public:
    my_str(const char* s) : len(strlen(s)) {
        str = new char[len + 1];
        ::strcpy(str, s); // используем глобальную strcpy
        cout << "Создана строка: \"" << str << "\"" << endl;
    }
    
    ~my_str() { 
        cout << "Удалена строка: \"" << str << "\"" << endl;
        delete[] str; 
    }
    
    // Конструктор копирования
    my_str(const my_str& other) : len(other.len) {
        str = new char[len + 1];
        ::strcpy(str, other.str); // используем глобальную strcpy
        cout << "Создана копия строки: \"" << str << "\"" << endl;
    }
    
    // Оператор присваивания
    my_str& operator=(const my_str& other) {
        if (this != &other) {
            delete[] str;
            len = other.len;
            str = new char[len + 1];
            ::strcpy(str, other.str); // используем глобальную strcpy
        }
        return *this;
    }
    
    void strcpy(const my_str& t) {
        if (len == t.len) {
            ::strcpy(str, t.str); // глобальная strcpy
        } else {
            delete[] str;
            len = t.len;
            str = new char[len + 1];
            ::strcpy(str, t.str); // глобальная strcpy
        }
        len = t.len;
        cout << "Скопирована строка: \"" << str << "\"" << endl;
    }
    
    const char* c_str() const { return str; }
    char* getStr() { return str; } // неконстантный доступ
};

int main() {
    SetConsoleOutputCP(65001);
    
    cout << "=== Задание 2.19 - Исправление ошибок ===" << endl;
    
    my_str a("aaa"), b("bb");
    const my_str c("ccc");
    
    cout << "\nВызовы функций:" << endl;
    
    cout << "1. b.strcpy(c): ";
    b.strcpy(c);                    // my_str::strcpy
    
    cout << "2. ::strcpy(b.getStr(), a.c_str()): ";
    ::strcpy(b.getStr(), a.c_str()); // глобальная strcpy
    
    cout << "3. b.strcpy(b): ";
    b.strcpy(b);                    // my_str::strcpy
    
    // c.strcpy(a);                 // ошибка - c константный
    cout << "4. c.strcpy(a) - ЗАКОММЕНТИРОВАНО (c константный)" << endl;
    
    cout << "5. ::strcpy(a.getStr(), b.c_str()): ";
    ::strcpy(a.getStr(), b.c_str()); // глобальная strcpy
    
    cout << "\nОбласти видимости функций:" << endl;
    cout << "- b.strcpy(c): функция-член класса my_str" << endl;
    cout << "- ::strcpy(...): глобальная функция из <cstring>" << endl;
    cout << "- b.strcpy(b): функция-член класса my_str" << endl;
    cout << "- ::strcpy(...): глобальная функция из <cstring>" << endl;
    
    return 0;
}
Соседние файлы в папке Лаба2