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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2010, 14:45   #11
Tirendus
Форумчанин
 
Аватар для Tirendus
 
Регистрация: 20.03.2009
Сообщений: 272
По умолчанию

Вот для этого примера:
Код:
int main() {
    Fraction f1(1,2);
        Fraction f2 = f1; 
        }
нужен конструктор копирования, так, как запись:

Код:
Fraction f2 = f1;
равносильна записи
Код:
Fraction f2(f1);
То есть происходит инициализация одного объекта другим.
Для такой записи юзайте конструктор
Код:
Fraction (const Fraction &f)
{
   num = f.num;
   den = f.den;
}
Если хотите, чтобы работал перегруженый оператор, сначала инициализируйте объект, потом делайте присваивание:

Код:
int main() {
    Fraction f1(1,2);
        Fraction f2(2,3); 
		f2 = f1;
}
Tirendus вне форума Ответить с цитированием
Старый 12.07.2010, 14:46   #12
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Superlotles Посмотреть сообщение
Код:
#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; 
        }
Здесь я не написал конструктор по умолчанию, компилятор свой тоже убрал,- ошибки нет, значит конструктор не создается
Нет, я говорил, что когда Вы пишете
Код:
Fraction f4; // создаётся объект и вызывается для него конструктор
f4 = f1 + f2 + f3; // рассчитывается результат правого выражения и вызывается присваивающее копирование для f4
В то время, как в
Код:
Fraction f4 = /* expression */ f1 + f2 + f3;
Конструкторы вообще не вызываются, но происходит запись результата выражения напрямую в f4. То есть, теоретически выражение справа должно было породить временный объект, значение которого должно было быть присвоено переменной f4. Так вот в этом случае f4 вроде как сразу выступает в виде этого временного объекта. Во всяком случае я так понял, особо не углублялся )
netrino вне форума Ответить с цитированием
Старый 12.07.2010, 14:54   #13
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

В С# красиво было бы сделать так
Код:
Fraction operator=(const Fraction& src){
                //cout << "kkkk" << endl;
                return new Fraction(src.num, src.den);
        }
в С++ это возможно?
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 12.07.2010, 15:14   #14
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от mrChester Посмотреть сообщение
В С# красиво было бы сделать так
Код:
Fraction operator=(const Fraction& src){
                //cout << "kkkk" << endl;
                return new Fraction(src.num, src.den);
        }
в С++ это возможно?
Эмм, а зачем так? Это менее производительно, ну да ладно, что важнее - это меняет семантику присваивания. Присваивание изменяет текущий объект, но не создаёт новый. И вот вернуло оно новый объект, но ведь переменная всё равно содержит ссылку на старый, в чём соль? Возможно я просто чего-то не до конца понимаю - .NET не использую )
netrino вне форума Ответить с цитированием
Старый 12.07.2010, 16:13   #15
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Если объект к которому присваивается значение не инициализирован без вызова конструктора произойдет ошибка, если проинициализирован, объект получит новое значение, а старым займется сборщик мусора
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 12.07.2010, 16:46   #16
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от mrChester Посмотреть сообщение
Если объект к которому присваивается значение не инициализирован без вызова конструктора произойдет ошибка, если проинициализирован, объект получит новое значение, а старым займется сборщик мусора
Немного не понимаю проблему. Ничего не инициализированным не будет, RAII в действии )
В C++ нет сборщика мусора, но это не столь важно, ибо, как я говорил, мы всё равно не получим копию правого объекта. operator= возвращает новый объект, а не изменяет текущий, в вашей реализации. То есть получается бессмысленный вызов
Код:
Fraction f;
f = Fraction (2, 4); // operator= (f, Fraction(2, 4));
То есть всё выражение (f = Fraction (2, 4)) вернёт новый объект, но f не будет изменена, вот о чём я. Или я жестоко туплю(что возможно - плохо соображаю сейчас), или Вы не правы )
netrino вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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