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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2010, 08:11   #1
Superlotles
Пользователь
 
Аватар для Superlotles
 
Регистрация: 18.08.2009
Сообщений: 86
По умолчанию Оператор присваивания

Почему тут
Код:
Fraction& operator=(const Fraction& src){
        set(src.num,src.den);
        cout << "bla-bla-bla" << endl;
        return *this;
    }
не выполняется эта строка
Код:
cout << "bla-bla-bla" << endl;
Вот весь код:
Код:
#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){
        num=src.num;
        den=src.den;
    }
    void set(int n, int d){
        num=n;
        den=d;
        normalize();
    }
    int get_num() const{
        return num;
    }
    int get_den() const{
        return den;
    }
    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);
        cout << "bla-bla-bla" << endl;
        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 = 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;
    }
Skype: Lotles-XXXX
Superlotles вне форума Ответить с цитированием
Старый 12.07.2010, 09:34   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
не выполняется эта строка
Да у тебя в принципе этот перегруженный оператор не выполняется
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.07.2010, 10:03   #3
Superlotles
Пользователь
 
Аватар для Superlotles
 
Регистрация: 18.08.2009
Сообщений: 86
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Да у тебя в принципе этот перегруженный оператор не выполняется
Если так сделать, то выполняется
Код:
Fraction f4; 
f4= f1+f2+f3;
Разница в чем ?
Skype: Lotles-XXXX
Superlotles вне форума Ответить с цитированием
Старый 12.07.2010, 10:23   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Разница в чем ?
Я Си не знаю так хорошо но хелп сказал что оператор = можно перегружать только как бинарный оператор для сравнений.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.07.2010, 10:43   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Superlotles Посмотреть сообщение
Если так сделать, то выполняется
Код:
Fraction f4; 
f4= f1+f2+f3;
Разница в чем ?
Очевидно это одна из оптимизаций. Результат выражения пишется сразу в f4, без создания промежуточного объекта, что видно по дизассемблированному коду. Во втором же случае вы сначала создаёте f4, для него вызывается стандартный конструктор, а уже потом происходит присваивание новому значению
netrino вне форума Ответить с цитированием
Старый 12.07.2010, 10:50   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
netrino
а почему в хелпе написана та ерунда что я сказал?
В чем подвох?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.07.2010, 11:16   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
а почему в хелпе написана та ерунда что я сказал?
В чем подвох?
Не знаю, видимо там ошибка )
Для класса должен быть перегружен оператор копирующего присваивания и он должен именно копировать "правый" объект в "левый"(относительно оператора). Наверное они хотели сказать "=="
netrino вне форума Ответить с цитированием
Старый 12.07.2010, 14:24   #8
Superlotles
Пользователь
 
Аватар для Superlotles
 
Регистрация: 18.08.2009
Сообщений: 86
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Очевидно это одна из оптимизаций. Результат выражения пишется сразу в f4, без создания промежуточного объекта, что видно по дизассемблированному коду. Во втором же случае вы сначала создаёте f4, для него вызывается стандартный конструктор, а уже потом происходит присваивание новому значению
Код:
#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; 
        }
Здесь я не написал конструктор по умолчанию, компилятор свой тоже убрал,- ошибки нет, значит конструктор не создается
Skype: Lotles-XXXX
Superlotles вне форума Ответить с цитированием
Старый 12.07.2010, 14:31   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Здесь я не написал конструктор по умолчанию
А Fraction(int n, int d) это разве не конструктор?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.07.2010, 14:34   #10
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А Fraction(int n, int d) это разве не конструктор?
Конструктор, но не конструктор по умолчанию, т.к. есть параметры
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перезагрузка оператора присваивания Tanya881103 Общие вопросы C/C++ 4 10.06.2010 15:47
delphi, оператор присваивания polnyi_novichek Помощь студентам 3 08.05.2010 23:04
оператор присваивания в delphi polnyi_novichek Помощь студентам 4 21.02.2010 21:28
Вычислить используя, оператор цикла for и оператор безусловного пе Knubbe Помощь студентам 1 18.12.2009 10:24
Если y – вещественная переменная, а n – целая, то оператор присваивания какой будет иметь вид? Naruto63 Помощь студентам 6 23.11.2009 16:30