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

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

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

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

05.08.2014, 00:45. Просмотров 298. Ответов 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 этими перегрузками...
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2014, 00:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка операторов, оператор присваивания (C++):

Перегрузка операторов умножения и присваивания - C++
Вечер добрый! Возникла проблема с перегрузкой операторов: dQuaternion dQuaternion :: operator*(dQuaternion&amp; QuatP) { dQuaternion...

Перегрузка операторов присваивания, ввода, вывода - C++
Приветствую, помогите реализовать перегрузку операторов(в частности операторы присваивания, ввода, вывода) для данной программы. Я не могу...

Перегрузка операторов умножения и присваивания для строк. - C++
Помогите, пожалуйста, реализовать перегрузку операторов умножения и присваивания для такого задания со строками: &quot;Описать класс, 3...

Оператор суммирования (классы, перегрузка операторов) - C++
#include &lt;iostream&gt; class mat { public: mat() { var = 0; } mat(int a) { var = a; } ~mat() { } void set(int b) { var =...

Перегрузка операторов. Инкапсуляция. Сделать так, чтобы оператор >> находил разницу между датами. - C++
Задание: Сделать так чтобы оператор &gt;&gt; находил разницу между датами. Программа рабочая. Написана на С++ Возникли проблемы с...

Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор * - C++
Помогите в следующем: Для класса шаблона следует перегрузить оператор присваивания, конструктор копирования, бинарный оператор суммы «*»,...

3
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.08.2014, 02:21 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Gygocopter Посмотреть сообщение
Не понимаю, как решает проблему перегрузка оператора, делается ведь все то же самое, что в конструкторе копии!?
ТОлько условие добавляется...
Если в классе нет оператора присваивания, то будет бызван оператор присваивание по умолчанию, будет просто копирование адреса, а не выделение новой памяти и копирование содержимого по адресу. Память, по этому адресу, будет освобождена при уничтожении копии, которую возвращает input(), поэтому show() выведет мусор. Потом будет второе освобождение, той же памяти, при уничтожении объекта ob, ошибка повторного освобождения памяти.
1
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;//ТУТ ОПЕРАЦИЯ ПРИСВАИВАНИЯ, А НЕ КОПИРОВАНИЯ! Вот так, товарищи!))
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.08.2014, 04:46 #4
Цитата Сообщение от Gygocopter Посмотреть сообщение
ТУТ ОПЕРАЦИЯ ПРИСВАИВАНИЯ, А НЕ КОПИРОВАНИЯ! Вот так, товарищи!
Кто-то говорил по-другому?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2014, 04:46
Привет! Вот еще темы с ответами:

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this - C++
Добрый день . Помогите понять принцип работы перегрузки операторов. объясните пожалуйста в зависимости от чего зависит агрумент при...

Перегрузка оператора присваивания - C++
Задание простое: по заданному классу составить простую программу с использованием динамической памяти. class Cow { char name; ...

Перегрузка оператора присваивания - C++
Доброго времени суток всем! Никак не могу правильно написать перегрузку оператора присваивания. При создании одного нового элемента...

Перегрузка оператора присваивания - C++
MyArray&amp; operator=( MyArray &amp;arrInt2 ) //Зачем писать MyArray&amp; operator?А почему не MyArray operator ? { delete ...


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

Или воспользуйтесь поиском по форуму:
4
Yandex
Объявления
05.08.2014, 04:46
Ответ Создать тему
Опции темы

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