Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Gygocopter
10 / 10 / 5
Регистрация: 05.02.2014
Сообщений: 124
#1

Перегрузка операторов, оператор присваивания - C++

05.08.2014, 00:45. Просмотров 280. Ответов 3
Метки нет (Все метки)

Перегрузка операторов, запутано-намутано

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "stdafx.h"
#include "conio.h"
#include <iostream>
 
using namespace::std;
class sample{
    char *s;
public:
    sample(){ s=0;}
    sample(const sample &ob);
    ~sample()
    {
        if (s) delete[]s;
        cout << "Осовбождение памяти!";
    }
    void show(){ cout << s << '\n'; }
    void set(char *str);
 
};
sample::sample(const sample &ob)
{
    s = new char[strlen(ob.s) + 1];
    strcpy(s, ob.s);
}
void sample::set(char *str)
{
    s = new char[strlen(str) + 1];
    strcpy(s, str);
}
 
sample input()
{
    char instr[80];
    sample str;
    cout << "введите строку: ";
    cin >> instr;
    str.set(instr);
    return str;
}
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0, "Rus");
    sample ob;
    ob = input();
    ob.show();
    _getch();
    return 0;
}
Пишет:
"Осовбождение памяти!"
"Осовбождение памяти!"
МУСОР
//Тут должно быть освобождение памяти(по книге), но возникает ошибка сразу и выход. Ок.

1)Первое освобождение памяти - это освобождается sample str в функции input().
2)Второе освобождение памяти - это освобождается временный объект, в который скопировался sample str;
3)Здесь выводится МУСОР, потому что было произведено побитовое копирование в sample ob, а память уже освободили.
4)Тут освобождение памяти sample ob;
Правильно ли я рассуждаю?

Вот правильная программа из книги:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include "stdafx.h"
#include "conio.h"
#include <iostream>
 
using namespace::std;
class sample{
    char *s;
public:
    sample(){ s=new char('\0');}
    sample(const sample &ob);
    ~sample()
    {
        if (s) delete[]s;
        cout << "Осовбождение памяти!";
    }
    void show(){ cout << s << '\n'; }
    void set(char *str);
    sample operator=(sample &ob);
};
sample::sample(const sample &ob)
{
    s = new char[strlen(ob.s) + 1];
    strcpy(s, ob.s);
}
void sample::set(char *str)
{
    s = new char[strlen(str) + 1];
    strcpy(s, str);
}
sample sample::operator=(sample &ob)
{
    if (strlen(ob.s)>strlen(s))
    {
        delete s;
        s = new char[strlen(ob.s) + 1];
    }
    strcpy(s, ob.s);
    return *this;
}
sample input()
{
    char instr[80];
    sample str;
    cout << "введите строку: ";
    cin >> instr;
    str.set(instr);
    return str;
}
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0, "Rus");
    sample ob;
    ob = input();
    ob.show();
    _getch();
    return 0;
}
Пишет:
"Осовбождение памяти!"
"Осовбождение памяти!"
"Осовбождение памяти!"
Строка введeнная
"Осовбождение памяти!"

1)Первое освобождение памяти - это освобождается sample str в функции input().
2)Тут освобождается delete []s - пустая строка.
3)Второе освобождение памяти - это освобождается временный объект, в который скопировался sample str;
4)Введенная строка
5)Тут освобождение памяти sample ob;
Правильно ли я рассуждаю? (или сначала 3), потом 2))..

Не понимаю, как решает проблему перегрузка оператора, делается ведь все то же самое, что в конструкторе копии!?
ТОлько условие добавляется... Но если убрать конструктор копии, программа работает некорректно.
Может кто-нибудь каждый шаг описать, пожалуйста?
Намутили, блин, c этими перегрузками...
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2014, 00:45     Перегрузка операторов, оператор присваивания
Посмотрите здесь:

C++ Перегрузка операторов умножения и присваивания для строк.
C++ Перегрузка оператора присваивания
C++ Оператор суммирования (классы, перегрузка операторов)
Перегрузка операторов. Инкапсуляция. Сделать так, чтобы оператор >> находил разницу между датами. C++
Перегрузка оператора присваивания C++
C++ Перегрузка операторов присваивания, ввода, вывода
Перегрузка оператора присваивания C++
C++ Перегрузка оператора присваивания
C++ Перегрузка оператора присваивания
C++ Перегрузка операторов умножения и присваивания
Перегрузка оператора присваивания C++
C++ Перегрузка оператора присваивания

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.08.2014, 02:21     Перегрузка операторов, оператор присваивания #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Gygocopter Посмотреть сообщение
Не понимаю, как решает проблему перегрузка оператора, делается ведь все то же самое, что в конструкторе копии!?
ТОлько условие добавляется...
Если в классе нет оператора присваивания, то будет бызван оператор присваивание по умолчанию, будет просто копирование адреса, а не выделение новой памяти и копирование содержимого по адресу. Память, по этому адресу, будет освобождена при уничтожении копии, которую возвращает input(), поэтому show() выведет мусор. Потом будет второе освобождение, той же памяти, при уничтожении объекта ob, ошибка повторного освобождения памяти.
Gygocopter
10 / 10 / 5
Регистрация: 05.02.2014
Сообщений: 124
05.08.2014, 04:30  [ТС]     Перегрузка операторов, оператор присваивания #3
Так вот в чём дело, перечитал еще раз о конструкторе копии!
C++
1
2
3
4
5
6
7
8
//
class myclass{...}
//
myclass b(3);
myclass a(b);//Конструктор копии!
myclass a = b;//Конструктор копии!
myclass a = _getOject();//Конструктор копии!
a=b;//ТУТ ОПЕРАЦИЯ ПРИСВАИВАНИЯ, А НЕ КОПИРОВАНИЯ! Вот так, товарищи!))
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.08.2014, 04:46     Перегрузка операторов, оператор присваивания #4
Цитата Сообщение от Gygocopter Посмотреть сообщение
ТУТ ОПЕРАЦИЯ ПРИСВАИВАНИЯ, А НЕ КОПИРОВАНИЯ! Вот так, товарищи!
Кто-то говорил по-другому?
Yandex
Объявления
05.08.2014, 04:46     Перегрузка операторов, оператор присваивания
Ответ Создать тему
Опции темы

Текущее время: 02:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru