С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
2 / 2 / 0
Регистрация: 15.05.2019
Сообщений: 110
1

Классы и перегрузка операций

28.08.2019, 11:40. Показов 1323. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.
Изучаю в данный момент классы и перегрузку операций.
Столкнулся с парой непонятных вещей, подскажите пожалуйста.

1)У Дейтлов в книге есть пример ими созданного класса Array, для работы с массивами целочисленных значений.
Там есть перегруженная элемент-функция(метод) присваивания одного объекта класса другому(например integer1=integer2):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const Array &Array::operator=(const Array &right)
{
   if (&right!=this) //избегать самоприсваивания
   {
      if (size!=right.size)
      {
         delete [] ptr;
         size = right.size;
         ptr=new int[size];
      }
      
      for (int i=0;i<size;i++)
      {
         prt[i]=right.ptr[i];
      }
      
      return *this;
   }
}
И ниже есть описание этой функции, где указано, цитирую:

"Если бы проверка на самоприсваивание не производилась, то при самоприсваивании функция operator= перед своим завершением удаляла бы динамическую память, ассоциированную с объектом." В результате ptr указывал бы на память, которая была удалена."

Но ведь при самоприсваивании, в вышеуказанной функции нигде не выделяется дин. память. Она же вроде выделяется, только если объекты разного размера, а в случае самоприсваивания размер одинаковый. Какая по их словам память удаляется при самоприсваивании, в данной функции(если бы не было проверки на самоприсваивание конечно)?


2)И второй вопрос:
Есть у меня в классе Str(мною сделанном) функция присваивания одного объекта Str другому:

C++
1
2
3
4
5
6
7
8
9
const Str &Str::operator=(const Str &right)
{
   delete [] sPtr;
   length=right.length;
   sPtr=new char[length+1];
   strcpy(sPtr,right.sPtr);
 
   return *this;
}
Я к примеру присваиваю один объект другому: string2=srting1;

Если я использую вышеуказанную функцию, как написано, всё нормально присваивается.
Но если я пытаюсь сделать возврат из функции не по ссылке а по значению, в string2 хранится мусор.
Помогает только использование Конструктора копирования.

C++
1
2
3
4
5
6
Str::Str(const Str &copys)
{
   length=copys.length;
   sPtr=new char[length+1];
   strcpy(sPtr,copys.sPtr);
}
Объясните пожалуйста, почему в в случае передачи по значению и без использования Конструктора копирования, в
string2 лежит мусор? Ведь все действия по записи в него string1 были произведены в функции. Как на него возврат данных влияет?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.08.2019, 11:40
Ответы с готовыми решениями:

Классы. Перегрузка операций. С++
Разработайте программу на языке С++, используя пользовательский тип данных – классы и перегрузку...

Классы перегрузка операций
Доброго времени суток. Помогите разобраться, что я не так пишу? По задаче мне нужно перегрузить...

Перегрузка операций << и >>
Всем добрый день.. У меня такая проблема, не получается перегрузить операторы &lt;&lt; и &gt;&gt; для своего...

Перегрузка операций
C++ ругается когда я пытаюсь сделать след-ю перегрузку операций. У меня трехмерный массив matrix и...

20
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,884
Записей в блоге: 1
29.08.2019, 16:38 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от dm_Consul Посмотреть сообщение
а как он объект class2 выводит?
наверно у тебя там тип возвращаемого объекта есть, а ретурна нет, вот он и выводит класс, но по стандарту если нет ретурна это UB.

Добавлено через 2 минуты
ретурна может не быть при имеющимся типе отличного от void только у main.
0
29.08.2019, 16:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.08.2019, 16:38
Помогаю со студенческими работами здесь

Перегрузка операций
#include &lt;iostream&gt; using namespace std; class chislo { public: chislo(); chislo(int...

Перегрузка операций << и >>
Помогите пожалуйста перегрузить &gt;&gt; и &lt;&lt; #include &lt;fstream&gt; #include &lt;iostream&gt; #include...

Перегрузка операций
Разработайте программу на языке С++, используя пользовательский тип данных – классы и перегрузку...

Перегрузка операций
Всем привет, нужно помощь, я самостоятельно изучаю программирование, наткнулся на лабораторную в...


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

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru