Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2014, 00:44   #1
Студ
Пользователь
 
Регистрация: 20.03.2014
Сообщений: 35
По умолчанию Почему не перегружаем оператор =

Имеется такой вопрос: есть класс, надо сложить 2 объекта класса по формуле z=x+y;

по моему мнению без перегрузки оператора присваивания не обойтись, но почему-то все работает и без него, перегружается только оператор +... (код не мой)... Разве так можно?

Программа ниже
Код:
/Перегрузка объединения подмножеств латинских букв
#include <ctype>
#include <iostream>
using namespace std;
class Alpha{//класс множества латинских букв
private:
unsigned bin; //бинарный код подмножества латинских букв
public:
Alpha() {bin=0;};
Alpha(Alpha& y) {bin=y.bin;};
Alpha(char*);
Alpha operator +(Alpha&);	
operator char*();
friend ostream& operator << (ostream&,Alpha&);
};// Alpha 
//конструктор множества букв по строке
Alpha::Alpha(char* s){ 
bin=0;
while(*s){
bin | = (1 << (tolower(*s)-'a')); s++;}
}//Alpha
//оператор объединения подмножеств букв
Alpha Alpha:: operator+(Alpha& y){ 
Alpha z;
z.bin=bin | y.bin;
return(z);}//operator+
//оператор вывода подмножеств букв
ostream& operator << (ostream& out,Alpha& z){ 
unsigned bit=1;
int i;
for(i=0; i<26;i++){
if((z.bin& bit)>0)
out<<(char)('a'+i);
bit=bit<<1;
}
return out;}// operator <<
//оператор преобразования множества в строку
Alpha:perator char*(){ 
static char s[32];
unsigned b=bin;
int i=0;
int j=0;
int w;
while(w>0){
if(w & 1)
s[j++]='a'+i;
i++;
w>>1;
}//while
s[j]='\0';
return (s);
}//operator char*()
//основная функция
int main (int argc,char* argv[]){ 
Alpha x(argv[1]); //буквы 1-го аргумента
Alpha y(argv[2]); //буквы 2-го аргумента
Alpha z; //буквы результата
z=x+y; // объединение подмножеств букв
cout<<z; // или cout<<(char*)z;
return (0);
}//main

Последний раз редактировалось Stilet; 21.03.2014 в 10:58.
Студ вне форума Ответить с цитированием
Старый 21.03.2014, 06:42   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Студ Посмотреть сообщение
Имеется такой вопрос: есть класс, надо сложить 2 объекта класса по формуле z=x+y;

по моему мнению без перегрузки оператора присваивания не обойтись, но почему-то все работает и без него, перегружается только оператор +... (код не мой)... Разве так можно?
хороший вопрос всегда содержит в себе ответ.
_Bers вне форума Ответить с цитированием
Старый 21.03.2014, 07:39   #3
halcyon
crafter
Форумчанин
 
Аватар для halcyon
 
Регистрация: 03.09.2011
Сообщений: 127
По умолчанию

Цитата:
Сообщение от Студ Посмотреть сообщение
Имеется такой вопрос: есть класс, надо сложить 2 объекта класса по формуле z=x+y;

по моему мнению без перегрузки оператора присваивания не обойтись, но почему-то все работает и без него, перегружается только оператор +... (код не мой)... Разве так можно?
В данном случае C++ генерирует оператор присваивания по умолчанию .
halcyon вне форума Ответить с цитированием
Старый 21.03.2014, 09:35   #4
Студ
Пользователь
 
Регистрация: 20.03.2014
Сообщений: 35
По умолчанию

Цитата:
Сообщение от halcyon Посмотреть сообщение
В данном случае C++ генерирует оператор присваивания по умолчанию .
интересно... а так о умолчанию только операторы присваивания могут генериться? и зачем тогда вообще нужна его перегрузка в явном виде?
Студ вне форума Ответить с цитированием
Старый 21.03.2014, 10:12   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Студ Посмотреть сообщение
интересно... а так о умолчанию только операторы присваивания могут генериться? и зачем тогда вообще нужна его перегрузка в явном виде?
оператор равно генерируется автоматически если нет иного, он просто почленно копирует.

его перегрузка нужна если не устраивает стандартный.
например если класс содержит указатели.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.03.2014, 10:29   #6
Студ
Пользователь
 
Регистрация: 20.03.2014
Сообщений: 35
По умолчанию

[QUOTE=Пепел Феникса;1354811]оператор равно генерируется автоматически если нет иного, он просто почленно копирует.

а это характерно только для оператора присваивания? или для других тоже так?
пытаюсь найти это в теории и не могу - нигде не упоминается про перегрузку по умолчанию...
Студ вне форума Ответить с цитированием
Старый 21.03.2014, 10:42   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Студ Посмотреть сообщение
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
оператор равно генерируется автоматически если нет иного, он просто почленно копирует.

а это характерно только для оператора присваивания? или для других тоже так?
пытаюсь найти это в теории и не могу - нигде не упоминается про перегрузку по умолчанию...
потому что это не перегрузка, потому и не находите.
генерируются по умолчанию:
конструктор копии(если нет иных конструкторов)
конструктор по умолчанию, без аргументов(если нет иных конструкторов)
не виртуальный деструктор(если нет явного)
оператор присваивания(если нет явного)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.03.2014, 11:48   #8
Студ
Пользователь
 
Регистрация: 20.03.2014
Сообщений: 35
По умолчанию

Спасибо!
Вроде бы все разобрал. ТОлько еще один момент никак не пойму -

out<<(char)('a'+i);

Что значит (char) - то есть почему он в скобках? Аналогичная запись используется при преобразовании типа, как в примере (char*), но он явно прописан, а (char)нет...
ДА и смысол строки - мы заносим в OUT значения справа?

Кстати, интересно, программа написана для работы с латинскими буквами в двоичной форме представления, и как я понял представление таково -
00...001 для a,
00...010 для b,
00...100 для c,
...
100...00 для z

это классика такая представления???
Студ вне форума Ответить с цитированием
Старый 21.03.2014, 12:45   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
это классика такая представления???
это двоичное представление, оно однозначно итак, классика тут не причем.
Цитата:
out<<(char)('a'+i);Что значит (char) - то есть почему он в скобках? Аналогичная запись используется при преобразовании типа, как в примере (char*), но он явно прописан, а (char)нет...
так же применяется, для приведения типов, чтоб operator << был вызван для типа char.
Цитата:
ДА и смысол строки - мы заносим в OUT значения справа?
для смысла строки нужно узнать что такое operator << объекта out(скорее всего это ostream)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
почему выдает ошибку паскаль? Program3.pas(30) : Встречено 'and', а ожидался оператор Julia1 Паскаль, Turbo Pascal, PascalABC.NET 13 08.02.2014 21:28
Условный оператор,оператор цикла и массив Klark73 Microsoft Office Excel 1 19.12.2011 17:09
Оператор выбора или условный оператор[Перенесено из JavaSE] merhaba1992 Помощь студентам 1 20.01.2011 17:06
Вычислить используя, оператор цикла for и оператор безусловного пе Knubbe Помощь студентам 1 18.12.2009 10:24