С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
15 / 15 / 3
Регистрация: 18.03.2012
Сообщений: 91

Типы данных в ООП

03.04.2012, 17:05. Показов 1805. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Пишу на C++, начал изучать, ООП, сейчас учу перегрузку операторов. При этом обнаружил некоторое недопонимание типов переменных, из-за чего столкнулся со сбоями в программе. Можете, пожалуйста, объяснить смысл типа, например, type& T или const type& T? Просто, когда в классе присутствуют динамические массивы, размеры которых мы по ходу программы изменяем, то сталкиваемся со следующей проблемой:
переопределяем оператор сложения так:
C++
1
2
3
4
5
6
type& operator +(type &T1, type& T2)
{
    type T(T1);
    /*прибавляем к T, T2*/
   return T;
}
но тогда значение переменной T не передается оператору присваивания. Ему передается не пойми что, из-за чего программа аварийно завершается. Если же тип, возвращаемый оператором сложения поставить type, а не type&, и перегрузить конструктор копирования, то все работает. Однако, ведь передавать все значение класса каждый раз - это очень медленно, так ведь?
Жду ответов, заранее благодарен!!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.04.2012, 17:05
Ответы с готовыми решениями:

Типы данных: есть ли универсальный тип, который может заменить все типы данных в Си?
Добрый вечер! Был бы очень признателен, если бы Вы помогли бы мне понять нижеследующие вопросы: 1. Можете ли на понятным для...

Какой формат базы данных DSN Access (атрибуты и типы данных)?
В настройках IIS можно выбирать формат журнала, один из форматов - это DSN Access, то есть события журналируются в базу данных. Так вот,...

Типы данных: чем отличается тип данных int от float?
Всем привет! Помогите пожалуйста, чем отличается тип данных int от float?

12
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
03.04.2012, 17:27
Цитата Сообщение от stanis-morozov Посмотреть сообщение
type& T
Ссылка на T
Цитата Сообщение от stanis-morozov Посмотреть сообщение
const type& T
Константная ссылка на T
Цитата Сообщение от stanis-morozov Посмотреть сообщение
переопределяем оператор сложения так:
Цитата Сообщение от stanis-morozov Посмотреть сообщение
type&
Возвращать ссылку на локальный не статический объект - круто. Никогда так не делайте.

А какой был вопрос? Только кратко, самое нужное выделите.
0
15 / 15 / 3
Регистрация: 18.03.2012
Сообщений: 91
03.04.2012, 17:56  [ТС]
Можете написать как должен выглядеть простенький класс, в котором есть динамически изменяющийся массив и перегрузить в нем, например, операторы + и =
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
03.04.2012, 18:44
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <stdexcept>
#include <cstring>
////////////////////////////////////////////////////////////////////////////////
template <class T>
class Foo
{
    std::size_t _size;
    std::size_t _realSize;
    T*          _arr;
    //--------------------------------------------------------------------------
    static const std::size_t STEP = 50;
    //--------------------------------------------------------------------------
public:
    explicit Foo(const std::size_t& size):
        _size(size),
        _realSize(STEP > size ? STEP : size + STEP),
        _arr(new T[_realSize])
    {
 
    }
    //--------------------------------------------------------------------------
    explicit Foo(): Foo(0)
    {
 
    }
    //--------------------------------------------------------------------------
    ~Foo()
    {
        delete[] _arr;
    }
    //--------------------------------------------------------------------------
    void push_back(const T elem)
    {
        if(_size == _realSize)
        {
            T* tmp = new T[_realSize];
            std::memcpy(tmp, _arr, _realSize * sizeof(T));
            delete[] _arr;
            _arr = new T[_realSize + STEP];
            std::memcpy(_arr, tmp, _realSize * sizeof(T));
            delete[] tmp;
            _realSize += STEP;
        }
        _arr[size++] = elem;
    }
    //--------------------------------------------------------------------------
    T& at(const std::size_t pos) const
    {
        if(_size > pos)
            return _arr[pos];
        else
            throw std::out_of_range("pos >= size");
    }
    //--------------------------------------------------------------------------
    const std::size_t size() const
    {
        return _size;
    }
    //--------------------------------------------------------------------------
    const Foo<T> operator+ (const Foo<T>& f)
    {
        Foo<T> ret(std::max(f.size(), _size));
 
        const std::size_t min = std::min(f.size(), _size);
        const std::size_t max = std::max(f.size(), _size);
 
        for(std::size_t i = 0; i < min; ++i)
            ret.at(i) = _arr[i] + f.at(i);
 
        for(std::size_t i = min; i < max; ++i)
            ret.at(i) = _arr[i];
 
        for(std::size_t i = min; i < max; ++i)
            ret.at(i) = f.at(i);
 
        return ret;
    }
    //--------------------------------------------------------------------------
    Foo& operator= (const Foo& f)
    {
        _size = f.size();
        if(_realSize)
            delete[] _arr;
        _realSize = f._realSize;
        _arr = new T[_realSize];
        std::memcpy(_arr, f._arr, _realSize * sizeof(T));
    }
};
////////////////////////////////////////////////////////////////////////////////
int main()
{
    Foo<int> f1(3);
    Foo<int> f2(5);
    for(std::size_t i = 0; i < 3; ++i)
        f1.at(i) = i;
    for(std::size_t i = 0; i < 5; ++i)
        f2.at(i) = i * 2;
    Foo<int> f3 = f1 + f2;
    for(std::size_t i = 0; i < 5; ++i)
        std::cout << f3.at(i) << " ";
    std::cout << std::endl;
    return 0;
}
2
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
03.04.2012, 19:24
Цитата Сообщение от soon Посмотреть сообщение
Константная ссылка на T
Скорее ссылка на константный объект. Ссылка сама по себе константа.
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
03.04.2012, 19:47
Toshkarik, я бы все-таки называл это константной ссылкой. Раз объект по-прежнему можно изменить не через ссылку, значит объект не константа.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
03.04.2012, 19:50
soon, в книгах почему то же пишут везде ссылка на константу.
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
03.04.2012, 19:56
Toshkarik, а в cppreferenc-ах и ему подобных, а так же в клссах пишут const_reference, а не reference_to_const. Как говорится, хоть горшком обзовите, только в печь не суйте.
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
03.04.2012, 20:11
explicit
Я вас очень прошу, ну не грузите новичков экспликтами. Признайте, это довольно редкая вещь и не стоит её писать просто, "чтоб была". Учебная программа тем ценнее, чем меньше в ней лишнего и демонстрируется только то, на что она нацелена. Вот проходят они операторы и конструкторы. И не нужно грузить экспликтами никого.
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
03.04.2012, 20:16
Kuzia domovenok, я пишу не только для участников этого форума, я также пишу для себя. А для себя я всегда буду писать explict. И не такая это уж редкая вещь.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
03.04.2012, 20:18
Kuzia domovenok, вот как раз когда проходят перегрузку и конструкторы да и классы вообще, тогда и нужно, я считаю, говорить о explicit.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
03.04.2012, 20:33
Цитата Сообщение от Toshkarik Посмотреть сообщение
Kuzia domovenok, вот как раз когда проходят перегрузку и конструкторы да и классы вообще, тогда и нужно, я считаю, говорить о explicit.
Я в любом случае считаю, что программы надо писать как можно проще. Даже помимо экспликтов (которые я всё равно считаю стоит использовать только в редких специфических случаях и предварительно объяснять необходимость в них, а не потому что в языке они есть) ты в примере использовал шаблоны и стандартную библиотеку. Ну ЗАЧЕМ??? Где у ТС сказано, что ему нужен шаблонный класс?
Я считаю, что особенно в учебных программах выпендриваться не надо и прежде чем что-то свободно использовать, надо досконально изучить. То есть: изучаешь операторы - вот и изучай, не городи шаблонов, пока с одним не разобрался.

Добавлено через 2 минуты
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ты в примере использовал шаблоны и стандартную библиотеку
Ах, пример не твой, я про soon значит говорил
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
03.04.2012, 21:00
Не будем превращать топик в подобие ветки о необходимости инкапсулирования данных. Вас переубеждать - себе дороже.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.04.2012, 21:00
Помогаю со студенческими работами здесь

Типы данных, которые можно использовать в предложении foreach в качестве поставщика данных
Типы данных, которые можно использовать в предложении foreach в качестве поставщика данных 1 StringBuilder объекты 2 String и...

Чтение недопустимых данных, динамические массивы, типы данных
Добрый день, реализую метод интерполяции сплайнами на С++, при подсчете одного из коэффициентов появляется данное сообщение. &quot;...

Типы данных С# для передачи данных через TCP
подскажите пожалуйста какой тип переменной лучше всего использовать в C# для передачи данных через TCP, что бы можно было передать...

Для следующих значений данных определить типы данных
Для следующих значений данных определить типы данных, указать какой объем памяти они занимают, ввести их в память компьютера как переменные...

Создание базы данных, таблиц, типы данных и триггеры
Здравствуйте. В колледже выдали задание по базам данных. Как создавать базы, таблицы и типы данных через встроенные инструменты - я...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru