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

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

Восстановить пароль Регистрация
 
Gygocopter
10 / 10 / 5
Регистрация: 05.02.2014
Сообщений: 124
05.08.2014, 00:45     Перегрузка операторов, оператор присваивания #1
Перегрузка операторов, запутано-намутано

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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 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
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.08.2014, 04:46     Перегрузка операторов, оператор присваивания #4
Цитата Сообщение от Gygocopter Посмотреть сообщение
ТУТ ОПЕРАЦИЯ ПРИСВАИВАНИЯ, А НЕ КОПИРОВАНИЯ! Вот так, товарищи!
Кто-то говорил по-другому?
Yandex
Объявления
05.08.2014, 04:46     Перегрузка операторов, оператор присваивания
Ответ Создать тему
Опции темы

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