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

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

Восстановить пароль Регистрация
 
Lotles
 Аватар для Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
12.07.2010, 12:29     Оператор присваивания #1
Почему в этом случае вызывается оператор присваивания
Код
        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;
	}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2010, 12:29     Оператор присваивания
Посмотрите здесь:

C++ Оператор присваивания и деструктор
C++ оператор присваивания
оператор присваивания C++
Оператор присваивания. C++
Оператор присваивания в c++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
12.07.2010, 13:08     Оператор присваивания #2
Потому, что в первом случае объект уже существует, и вызывается оператор присваивания для существующего объекта, а во втором - объект еще не существует, вызывается конструктор для него.
Lotles
 Аватар для 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; 
	}
Здесь я не написал конструктор по умолчанию, компилятор свой тоже убрал,- ошибки нет, значит конструктор не создается
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
12.07.2010, 13:44     Оператор присваивания #4
Цитата Сообщение от Lotles Посмотреть сообщение
Здесь нет стандартного конструктора, ошибки тоже нет, значит конструктор не создается
Lotles, как показал относительно недавний опыт, конструктор таки вызывается
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
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;
}
Попробуй сделать конструктор копирования закрытым и посмотри на результат.
Lotles
 Аватар для Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
12.07.2010, 14:07  [ТС]     Оператор присваивания #6
Цитата Сообщение от M128K145 Посмотреть сообщение
Lotles, как показал относительно недавний опыт, конструктор таки вызывается
Доказательства !!!
[Freeman]
34 / 34 / 6
Регистрация: 07.06.2010
Сообщений: 118
12.07.2010, 14:15     Оператор присваивания #7
Можно в конструктор добавить
C++
1
std::cout<<"Konstruktor called";
и смотреть когда он вызывается
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
12.07.2010, 14:39     Оператор присваивания #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Lotles, при конструировании объекта всегда вызывается конструктор - иного способа создать объект попросту не существует. Аналогично, при разрушении объекта всегда вызывается деструктор.
Существуют конструкторы:
1. дефолтный,
2. пользовательский,
3. копирования.
Несложно ведь написать код и посмотреть, когда какой вызывается.....
Lotles
 Аватар для Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
12.07.2010, 14:44  [ТС]     Оператор присваивания #9
Цитата Сообщение от CheshireCat Посмотреть сообщение
Lotles, при конструировании объекта всегда вызывается конструктор - иного способа создать объект попросту не существует. Аналогично, при разрушении объекта всегда вызывается деструктор.
Существуют конструкторы:
1. дефолтный,
2. пользовательский,
3. копирования.
Несложно ведь написать код и посмотреть, когда какой вызывается.....
Про конструктор копирования знаю, остальные пока не встречал
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2010, 15:07     Оператор присваивания
Еще ссылки по теме:

Оператор присваивания C++
Оператор присваивания C++
Перегруженный оператор присваивания C++

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

Или воспользуйтесь поиском по форуму:
[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);
        }
дефолтный который без аргументов
Yandex
Объявления
12.07.2010, 15:07     Оператор присваивания
Ответ Создать тему
Опции темы

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