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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Элементарный ввод/вывод - ошибка "Cout undeclared" http://www.cyberforum.ru/cpp-beginners/thread1238485.html
списал програму с книги,а выбивает ошибку вот: #include<ioastream> using namespace std; int main() { int x = 5; int y=7; cout << "\n"; cout << x+y << " " <<x*y;
C++ Какая разница между компиляцией и компоновкой? только начал учить C++ и возник такой вопрос http://www.cyberforum.ru/cpp-beginners/thread1238484.html
C++ Односвязный список, удалить элементы используя фильтр
Решите пример, на основе него я смогу разобраться: Есть класс Human имеющий два поля int number и string name . Есть 10 объектов класса , т.е. 10 имен (в идеале большое число) с номерами от 1 до 10, записанные с помощью односвязного списка. И есть 3 типа фильтров, применение которых удаляет с помощью итератора все объекты, номера которых не соответствуют указанным в фильтре : 1) 1,2,3,7,8 ...
C++ Собрать билдер из блокнота + какой-нибудь компилятор
хочу собрать легкий билдер из блокнота + какой нибудь компилятор, для простых консольных приложений, так вот вопросы: 1. какой компилятор взять лучше для такой цели и где его скачать? 2. как сделать компиляцию из блокнота? (notepad++) видел где то уже инструкцию, но потерял ссыль... 3. как это все будет выглядеть с точки зрения архитектуры файлов скажем так, т.е. как .h-ники будут видеть...
C++ Правильное подключение заголовочных файлов http://www.cyberforum.ru/cpp-beginners/thread1238447.html
Как подключать заголовочные файлы я знаю, но вот у меня есть вопрос, ответ на который я нигде не видел, не видел даже рекомендаций как правильней писать. А ситуация следующая: Допустим у нас есть два класса - one.h (one.cpp) и two.h (two.cpp). В two.h подключен заголовочный файл one.h. А в one.h подключен допустим библиотечный файл iostream. Так вот вопрос, если в two.cpp я хочу воспользоваться...
C++ Как перевести строку в целочисленный массив А как перевести строку в целочисельный массив? Проверьте здесь http://ideone.com/ /* package whatever; // don't place package name! */ import java.util.*; import java.lang.*; import java.io.*; /* Name of the class has to be "Main" only if the class is public. */ подробнее

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

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 этими перегрузками...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 16:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru