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

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

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

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

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

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

Интересует такой вопрос: есть программа для лабораторки по объединению множества латинских букв
в main создается объект Z, куда и будет заноситься результат вызовом конструктора Alpha z.
ДАлее при перегрузке оператора + опять вызывается этот же конструктор для создания объекта с тем же именем - ошибка или какой-то тайный смысл??? Спасибо!

Код:
//Перегрузка объединения подмножеств латинских букв
#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::operator 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

Последний раз редактировалось ACE Valery; 21.03.2014 в 20:59.
Студ вне форума Ответить с цитированием
Старый 20.03.2014, 19:52   #2
halcyon
crafter
Форумчанин
 
Аватар для halcyon
 
Регистрация: 03.09.2011
Сообщений: 127
По умолчанию

В операторе
Код:
Alpha Alpha::operator+( Alpha& y )
создается новый объект Alpha z, имя z локально, с именем z из main() не конфликтует, если вы об этом. Судя по оформлению кода - явно тайный смысл.
halcyon вне форума Ответить с цитированием
Старый 20.03.2014, 20:10   #3
Студ
Пользователь
 
Регистрация: 20.03.2014
Сообщений: 35
По умолчанию

Спасибо! то что не конфликтует, я видела, но тогда зачем создавать их с одним именем? А тогда еще вопрос - а нельзя просто работать с полями уже созданного объекта z в операторе перегрузки?
Студ вне форума Ответить с цитированием
Старый 20.03.2014, 20:29   #4
halcyon
crafter
Форумчанин
 
Аватар для halcyon
 
Регистрация: 03.09.2011
Сообщений: 127
По умолчанию

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

Цитата:
А тогда еще вопрос - а нельзя просто работать с полями уже созданного объекта z в операторе перегрузки?
Создание объекта z в операторе
Код:
Alpha Alpha::operator+( Alpha &y )
избыточно.

Можно сделать так:
Код:
Alpha Alpha::operator+( Alpha& y )
{ 
	bin |= y.bin;
	return *this;
}
Цитата:
с полями уже созданного объекта z
Для Z, который создается в main() присваивается значение x+y. Объект x вызывает перегруженный оператор operator+( Alpha &y ). Т.е. z = x+y можно представить как
Код:
 z = x.operator+(y);
В operator+( Alpha &y ) вы можете работать с полями, которые принадлежат объекту x

Последний раз редактировалось halcyon; 20.03.2014 в 20:34.
halcyon вне форума Ответить с цитированием
Старый 20.03.2014, 20:52   #5
Студ
Пользователь
 
Регистрация: 20.03.2014
Сообщений: 35
По умолчанию

Это как раз то что я хотела услышать! Спросить у автора хорошая дея, нам этот код на семинарах дают...
Можно еще вопросы - компилятор ругается на строчку

bin | = (1 << (tolower(*s)-'a')); s++;}

выдает expected primary-expression before '=' token...


и ругается на строчку

#include <ctype> - заменила на #include <ctype.h> - ругаться перестал но сомневаюсь будет ли корректно работать!

Зараенее огромное спасибо!
Студ вне форума Ответить с цитированием
Старый 20.03.2014, 21:58   #6
halcyon
crafter
Форумчанин
 
Аватар для halcyon
 
Регистрация: 03.09.2011
Сообщений: 127
По умолчанию

Цитата:
Сообщение от Студ Посмотреть сообщение
Это как раз то что я хотела услышать! Спросить у автора хорошая дея, нам этот код на семинарах дают...
Можно еще вопросы - компилятор ругается на строчку

bin | = (1 << (tolower(*s)-'a')); s++;}

выдает expected primary-expression before '=' token...


и ругается на строчку

#include <ctype> - заменила на #include <ctype.h> - ругаться перестал но сомневаюсь будет ли корректно работать!

Зараенее огромное спасибо!
#include <cctype>

В
Код:
bin | = (1 << (tolower(*s)-'a')); s++;
между символами | и = стоит лишний пробел.
halcyon вне форума Ответить с цитированием
Старый 20.03.2014, 23:19   #7
Студ
Пользователь
 
Регистрация: 20.03.2014
Сообщений: 35
По умолчанию

спасибо, работает!
Студ вне форума Ответить с цитированием
Старый 21.03.2014, 21:02   #8
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Ну и я вопрос задам по теме. Что это:
Цитата:
while(*s){
bin | = (1 << (tolower(*s)-'a')); s++;}
}
?
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 21.03.2014, 22:03   #9
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2ACE Valery
даю наводку:
Код:
class Alpha{//класс множества латинских букв
Код:
unsigned bin; //бинарный код подмножества латинских букв
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 25.03.2014, 14:10   #10
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

pproger, я о подобной форме записи
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Divine Elemente для создания wordpress тем gusakgu WordPress и другие CMS 3 27.03.2014 03:28
constructor вызывается много раз CeHTuJI Общие вопросы Delphi 10 26.08.2013 02:45
Списки. Свойства. Обьекты. оДин раз получить информацию для объекта. Человек_Борща Общие вопросы Delphi 0 01.07.2012 03:01
Зачем нужен копирующий конструктор? Rekky Общие вопросы C/C++ 3 25.08.2011 13:03
как в цикле создавать массив с одним и тем же именем!?ошибка в ходе выполнения -access violation at addr sleevman Помощь студентам 2 28.10.2009 19:06