Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
#1

Оператор присваивания - C++

12.07.2010, 12:29. Просмотров 843. Ответов 9
Метки нет (Все метки)

Почему в этом случае вызывается оператор присваивания
Код
        Fraction f4;
        f4 = f1+f2+f3;
а в другом не вызывается:
Код
Fraction f4 = f1+f2+f3;
Вот весь код:
Код
#include <stdafx.h>
#include <conio.h>
using namespace std;
class Fraction {
public:
	int num,den;
private:
	void normalize(){
	if (den == 0 || num == 0) {
        num = 0;
        den = 1;
    }
    if (den < 0) {
        num *= -1;
        den *= -1;
    }
    int n = gcf(num, den);
    num = num / n;
    den = den / n;
}
	int gcf(int a, int b){
		 if (a % b == 0)
        return abs(b);
    else
        return gcf(b, a % b);
}
	int lcm(int a, int b){
		return (a/gcf(a,b))*b;
	}
public:
	Fraction(){
		set(0,1);
	}
	Fraction(int n, int d){
		set(n,d);
	}
	Fraction(int n){
		set(n,1);
	}
	Fraction(const Fraction& src){
		cout << "kk" << endl;
		num=src.num;
		den=src.den;
	}
	void set(int n, int d){
		num=n;
		den=d;
		normalize();
	}
	Fraction add(const Fraction& other){
    Fraction fract;
	int lcd =lcm(den, other.den);
    int quot1 = lcd/den;
    int quot2 = lcd/other.den;
    fract.set(num * quot1 + other.num * quot2, lcd);
    fract.normalize();
    return fract;
}
	Fraction mult(const Fraction& other) {
    Fraction fract;
    fract.set(num * other.num, den * other.den);
    fract.normalize();
    return fract;
}
	Fraction operator*(const Fraction& other){
		return mult(other);
	}
	Fraction operator=(const Fraction& src){
		set(src.num,src.den);
		return *this;
	}
	bool operator==(const Fraction& other){
		return(num==other.num && den==other.den);
	}
	Fraction operator+(const Fraction& other){
		return add(other);
	}
	friend ostream& operator << (ostream& os, Fraction& fr){
		os << fr.num << fr.den;
		return os;
	}
	bool operator>(const Fraction &other){
		return ((num * other.den) > (den * other.num));
}
	bool operator<(const Fraction &other){
		return ((num * other.den) < (den * other.num));
}  
};
int main() {
        Fraction f1(1,2);
        Fraction f2(1,3);
        Fraction f3(5);
        Fraction f4;
        f4 = f1+f2+f3; 
	cout << "1/2 + 1/3 + 5 = " << f4.num << "/" << f4.den << endl;
	Fraction f5 = f1*f2*f3;
	cout << "1/2 * 1/3 * 5 = " << f5.num << "/" << f5.den << endl;
	if (f3>f2==true && f3>f2==true && f1>f2==true)
		cout << f2.num << "/" << f2.den << " < " << f1.num << "/" << f1.den << " < " << f3.num << "/" << f3.den << endl;
		return 0;
	}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2010, 12:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Оператор присваивания (C++):

Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор * - C++
Помогите в следующем: Для класса шаблона следует перегрузить оператор присваивания, конструктор копирования, бинарный оператор суммы «*»,...

Оператор присваивания. - C++
Всем привет!В универе щас работаем с классами и перегрузками.В частности перегрузкой оператора присваивания и индексации.И я в упор не...

оператор присваивания - C++
Подскажите пожалуйста, вот я создал класс, конструктор которого создает 2хмерный массив из 2ойного указателя, являющейся членом этого...

Оператор присваивания - C++
Добрый день! Помогите, пожалуйста, разобраться. Я не совсем понимаю работу перегруженного оператора присваивания в классе String, который...

оператор присваивания - C++
Привет всем ! Каким образом вызывается оператор присваивания, например, здесь: a = &quot;I &quot;; если в аргументе char*, а в операторе...

Оператор присваивания - C++
Какая разница между оператором &quot;=&quot; и &quot;==&quot; Почему , например , в цикле нужно писать while(count==1) а не ...

9
CheshireCat
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,405
12.07.2010, 13:08 #2
Потому, что в первом случае объект уже существует, и вызывается оператор присваивания для существующего объекта, а во втором - объект еще не существует, вызывается конструктор для него.
0
Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
12.07.2010, 13:41  [ТС] #3
Цитата Сообщение от CheshireCat Посмотреть сообщение
Потому, что в первом случае объект уже существует, и вызывается оператор присваивания для существующего объекта, а во втором - объект еще не существует, вызывается конструктор для него.
Код
#include <stdafx.h>
#include <conio.h>
using namespace std;
class Fraction {
public:
	int num,den;
	Fraction(int n, int d){
		set(n,d);
	}
	void set(int n, int d){
		num=n;
		den=d;
	}
	Fraction operator=(const Fraction& src){
		cout << "kkkk" << endl;
		set(src.num,src.den);
		return *this;
	}
};
int main() {
    Fraction f1(1,2);
	Fraction f2 = f1; 
	}
Здесь я не написал конструктор по умолчанию, компилятор свой тоже убрал,- ошибки нет, значит конструктор не создается
0
M128K145
Эксперт С++
8299 / 3519 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
12.07.2010, 13:44 #4
Цитата Сообщение от Lotles Посмотреть сообщение
Здесь нет стандартного конструктора, ошибки тоже нет, значит конструктор не создается
Lotles, как показал относительно недавний опыт, конструктор таки вызывается
0
CheshireCat
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,405
12.07.2010, 13:53 #5
Цитата Сообщение от Lotles Посмотреть сообщение
Здесь я не написал конструктор по умолчанию, компилятор свой тоже убрал,- ошибки нет, значит конструктор не создается
Это ошибочное утверждение. Здесь вызывается конструктор копирования. Вот исправленный код:
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
#include <iostream>
using namespace std;
 
class Fraction
{
public:
    int num,den;
 
    Fraction(int n, int d)
    {
        set(n,d);
    }
 
//private:
    // конструктор копирования:
    Fraction(const Fraction& src)
    {
        cout << "Copy ctor called!" << endl;
        set(src.num,src.den);
    }
 
public:
    void set(int n, int d)
    {
        num=n;
        den=d;
    }
 
    Fraction operator=(const Fraction& src)
    {
        cout << "kkkk" << endl;
        set(src.num,src.den);
        return *this;
    }
};
 
 
int main()
{
    Fraction f1(1,2);
    Fraction f2 = f1;
}
Попробуй сделать конструктор копирования закрытым и посмотри на результат.
0
Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
12.07.2010, 14:07  [ТС] #6
Цитата Сообщение от M128K145 Посмотреть сообщение
Lotles, как показал относительно недавний опыт, конструктор таки вызывается
Доказательства !!!
0
[Freeman]
34 / 34 / 6
Регистрация: 07.06.2010
Сообщений: 118
12.07.2010, 14:15 #7
Можно в конструктор добавить
C++
1
std::cout<<"Konstruktor called";
и смотреть когда он вызывается
0
CheshireCat
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,405
12.07.2010, 14:39 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Lotles, при конструировании объекта всегда вызывается конструктор - иного способа создать объект попросту не существует. Аналогично, при разрушении объекта всегда вызывается деструктор.
Существуют конструкторы:
1. дефолтный,
2. пользовательский,
3. копирования.
Несложно ведь написать код и посмотреть, когда какой вызывается.....
0
Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
12.07.2010, 14:44  [ТС] #9
Цитата Сообщение от CheshireCat Посмотреть сообщение
Lotles, при конструировании объекта всегда вызывается конструктор - иного способа создать объект попросту не существует. Аналогично, при разрушении объекта всегда вызывается деструктор.
Существуют конструкторы:
1. дефолтный,
2. пользовательский,
3. копирования.
Несложно ведь написать код и посмотреть, когда какой вызывается.....
Про конструктор копирования знаю, остальные пока не встречал
0
[Freeman]
34 / 34 / 6
Регистрация: 07.06.2010
Сообщений: 118
12.07.2010, 15:07 #10
Lotles, в смысле не встречал вот у тебя в коде пользовательский конструктор:
C++
1
2
3
4
    Fraction(int n, int d) 
    {
        set(n,d);
    }
вот
C++
1
2
3
Fraction(){
                set(0,1);
        }
дефолтный который без аргументов
0
12.07.2010, 15:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2010, 15:07
Привет! Вот еще темы с ответами:

Оператор присваивания в c++ - C++
Такой вопрос, для каких классов следует явно перегрузить оператор присваивания??

Перегруженный оператор присваивания - C++
Добрый вечер! Встретил пример в книге, где есть перегруженный оператор присваивания. В итоге код который написан в книге не запускается. Во...

Оператор присваивания и деструктор - C++
Вопрос: почему в 52 строке Access violation? Если убрать строку 50, все будет нормально. #include &lt;iostream&gt; using namespace std; ...

Перегруженный оператор присваивания - C++
Достаточно информации прочитал, что такое перегруж. оператор присваивания, но не до конца понимаю суть данного вопроса - &quot;в каком месте...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.