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

Перегрузка операции + - C++

Восстановить пароль Регистрация
 
Holsteng
 Аватар для Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
06.05.2012, 14:41     Перегрузка операции + #1
Всем привет!

Ребята, обясните, пжлста, почему конструктор вызывается дважды.

Код
Rational integer1( c, d ),h;// инициализация h ( здесь я понимаю почему вызывается конструктор)
	h=integer + integer1;// а почему вызывается здесь не пойму, ведь должен вызываться operator =
Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.05.2012, 14:41     Перегрузка операции +
Посмотрите здесь:

C++ Перегрузка операции =
Перегрузка операции C++
C++ Перегрузка операции
Перегрузка операции C++
Перегрузка операции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
06.05.2012, 14:46     Перегрузка операции + #2
Выложите полный код.
Навскидку - временный объект(или переменная) создается в реализации оператора.
Holsteng
 Аватар для Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
06.05.2012, 14:59  [ТС]     Перегрузка операции + #3
Код
#include <iostream>
#include "Rational.h"
using namespace std;

Rational::Rational( int a, int b )
{
	 Setchislitel( a, b, true );
}

int Rational::Correction ( int a, int b )
{ 
	int n = a > b ? b : a;

	for (int i = 2; i <= n; ++i )

		if ( a % n == 0 && b % n == 0 )

			return n;
	return 1;
}

void operator<<( ostream& output, const Rational & b) 
{
	output << b.chislitel << b.znamenatel;
}

void Rational::Setchislitel(int a, int b, bool flac)
{
	
	if ( b > 0 && flac )
	{
		int base = Correction( a,b );
			chislitel=a / base; 
			znamenatel=b / base;
	}
	else
		if ( b < 0 )
		cout << "Знаменатель меньше нуля или равен 0";

	if (!flac)
	{
		chislitel=a; 
		znamenatel=b;
	}

}

const Rational& Rational::operator + (const Rational& plus)
{
	Rational sky;

	sky.znamenatel = plus.znamenatel * this->znamenatel;

	sky.chislitel = ((sky.znamenatel)/plus.znamenatel)*plus.chislitel + 
		((sky.znamenatel)/this->znamenatel)*this->chislitel;
	int base = Correction(sky.znamenatel, sky.chislitel);

	sky.chislitel=sky.chislitel/base;

	sky.znamenatel=sky.znamenatel/base;

	return sky;
}

const Rational& Rational::operator-(const Rational& plus)
{
	Rational sky;

	sky.znamenatel = plus.znamenatel * this->znamenatel;

	sky.chislitel = (sky.znamenatel)/plus.chislitel - 
		(sky.znamenatel)/this->chislitel;
	int base = Correction(sky.znamenatel, sky.chislitel);

	sky.chislitel=sky.chislitel/base;

	sky.znamenatel=sky.znamenatel/base;

	return sky;
}

const Rational& Rational::operator*(const Rational& plus)
{
	Rational sky;

	sky.znamenatel = plus.znamenatel * this->znamenatel;

	sky.chislitel = plus.chislitel * this->chislitel;

	int base = Correction(sky.znamenatel, sky.chislitel);

	sky.chislitel=sky.chislitel/base;

	sky.znamenatel=sky.znamenatel/base;
	
	return sky;
}

const Rational& Rational::operator/(const Rational& plus)
{
	Rational sky;

	sky.chislitel = plus.znamenatel * this->znamenatel;

	sky.znamenatel = plus.chislitel * this->chislitel;

	int base = Correction(sky.znamenatel, sky.chislitel);

	sky.chislitel=sky.chislitel/base;

	sky.znamenatel=sky.znamenatel/base;
	
	return sky;
}

const Rational& Rational::operator = (const Rational& x)
	
{
	if (&x!=this)
	{
		Setchislitel ( x.chislitel,x.znamenatel, false );
		return *this;
	}
	else
		if ( &x==this )
			cout << "Самоприсваивание";
	
}

bool Rational::operator!=  (const Rational& x) const
	
{		
	return !( &x==this );
}

bool Rational::operator < (const Rational& x) const
	
{		
	if( this->chislitel < x.chislitel || this->znamenatel < x.znamenatel )

	return true;

	else
		return false;
}

bool Rational::operator == (const Rational& x) const
	
{		
	if( this->chislitel == x.chislitel || this->znamenatel == x.znamenatel )

	return true;

	else
		return false;
}

bool Rational::operator > (const Rational& x) const
	
{		
	return ( x < *this );
}

bool Rational::operator <= (const Rational& x) const
	
{		
	return ( *this < x  );
}

bool Rational::operator >= (const Rational& x) const
	
{		
	return !( *this < x  );
}

void main()
{
	setlocale (LC_ALL, "rus");
	cout << "Введите первую дробь\n";
	int a, b, c, d;
	cin >> a >> b;
	
	Rational integer( a, b )/*, integer1( c, d ), integer2 (2,2)*/;

	cout << "Введите вторую дробь\n";
	cin >> c >> d;
	Rational integer1( c, d ),
		h;
	h=integer + integer1;
	cout << h;
	
	system("pause");
}
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
06.05.2012, 15:05     Перегрузка операции + #4
Ну да.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const Rational& Rational::operator + (const Rational& plus)
{
    Rational sky; //вызывается конструктор по умолчанию
 
    sky.znamenatel = plus.znamenatel * this->znamenatel;
 
    sky.chislitel = ((sky.znamenatel)/plus.znamenatel)*plus.chislitel + 
        ((sky.znamenatel)/this->znamenatel)*this->chislitel;
    int base = Correction(sky.znamenatel, sky.chislitel);
 
    sky.chislitel=sky.chislitel/base;
 
    sky.znamenatel=sky.znamenatel/base;
 
    return sky;
}
Holsteng
 Аватар для Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
06.05.2012, 15:13  [ТС]     Перегрузка операции + #5
Вы правы, но мне интересно здесь
Код
Rational integer1( c, d ),h;// инициализация h ( здесь я понимаю почему вызывается конструктор)
    h(а почему вызывается здесь не пойму, ведь должен вызываться operator =)=integer + integer1;
Я проверял через Debuger
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
06.05.2012, 15:16     Перегрузка операции + #6
Оператор присваивания также вызывается, но после оператора сложения. В операции сложения создается объект sky, для которого и вызывается конструктор по умолчанию. Если непонятно, то пройдитесь трассировщиком, так нагляднее будет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2012, 15:34     Перегрузка операции +
Еще ссылки по теме:

Перегрузка операции ~ C++
Перегрузка операции >> C++
C++ Перегрузка операции

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

Или воспользуйтесь поиском по форуму:
Holsteng
 Аватар для Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
06.05.2012, 15:34  [ТС]     Перегрузка операции + #7
Уважаемый diagon , я проверял отладчиком, конструктор вызывается в том месте, где я указал.Высылаю на суд общественности header файл. Попробуйте и Вы, может то компилятор такой, у меня VS2010.
Код
#ifndef ARRAY_H
#define ARRAY_H
#include <iostream>
using namespace std;


class Rational
{
public:
	Rational ( int=1 , int=2 );
	friend void operator << (ostream& output, const Rational &);
	void Setchislitel( int, int, bool );
	const Rational& operator=( const Rational& );
	const Rational& operator+( const Rational& );
	const Rational& operator-( const Rational& );
	const Rational& operator*( const Rational& );
	const Rational& operator/( const Rational& );
	bool operator<( const Rational& )const;
	bool operator<=( const Rational& )const;
	bool operator>( const Rational& )const;
	bool operator>=( const Rational& )const;
	bool operator!=( const Rational& )const;
	bool operator==( const Rational& )const;
	private:
	int Correction( int, int );
	int chislitel, 
		znamenatel;
};

#endif
Yandex
Объявления
06.05.2012, 15:34     Перегрузка операции +
Ответ Создать тему
Опции темы

Текущее время: 10:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru