Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Конструктор копирования 
:(
    Опции темы
Lotles
Дата 31.10.2010, 16:47 (ссылка)    | (голосов:6) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 6.4.2010

Репутация: нет
Всего: нет



Код

#include <stdafx.h>
#include "Fraction.h"
using namespace std;
class FloatFraction : public Fraction {
public:
    FloatFraction(){
        set(0, 1);
    }
    FloatFraction(int n, int d){
        set(n, d);
    }
    FloatFraction(int n){
        set(n, 1);
    }
    double get_float(){
      return static_cast<double>(get_num())/get_den();
    }
    FloatFraction(const Fraction& src) {
         set(src.get_num(), src.get_den());     
         printf ("zzzzzzzzz\n");
     }
};
class ProperFraction : public FloatFraction {
public:
    ProperFraction(){
        set(0, 1);
    }
    ProperFraction(int n, int d){
        set(n, d);
    }
    ProperFraction(int n){
        set(n, 1);
    }
    ProperFraction(const Fraction& src){
        set(src.Fraction::get_num(), src.get_den());
    }
    void pr_proper(ostream& os){
            if (get_whole() != 0)
            os << get_whole() << " ";
            os << get_num() << "/" << get_den();
        }
        int get_whole(){
                int n = Fraction::get_num();
                return n / get_den();
        }
        int get_num(){
                int n = Fraction::get_num();
                return n % get_den();
        }
};
int main() {
    ProperFraction f1(1,2),f2(5,6),f3;
    _asm int 3;
    f3=f1+f2;
    cout << "Value of f3 is ";
    f3.pr_proper(cout);
    cout << endl;
    cout << "Float value of is " << f3.get_float() << endl;
    return 0;
}

Вот Fraction.h
Код

#include "stdafx.h"
#include "conio.h"
using namespace std;
class Fraction{
private:
    void normalize(){
        if (den == 0 || num == 0) {
        num = 0;
        den = 1;
        }
    }
    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:
    int num, den;
    Fraction(){
        set(0, 1);
    }
    Fraction(int n, int d){
        set(n, d);
    }
    Fraction(int n){
        set(n,1);
    }
    Fraction(const Fraction& src){
        set(src.num,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 add(other);
        }
    Fraction operator=(const Fraction& src){
        set(src.num, src.den);
        cout << "6666666666666" << endl;
        return *this;
    }
    Fraction operator*(const Fraction& other){
        return mult(other);
    }   
    friend ostream& operator << (ostream& os, Fraction& fr){
        os << fr.num << "/" << fr.den;
        return os;
    }
};

Я не пойму почему в
Код

f3=f1+f2

вызывается
Код

Fraction operator+(const Fraction& other){
        return add(other);
        } 

У нас f2 имеет тип ProperFraction, а в аргументе operator+ Fraction

Это сообщение отредактировал(а) Lotles - 1.11.2010, 17:51
PM MAIL Skype   Вверх
bsa
Дата 2.11.2010, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Lotles, а для чего у тебя еще определен оператор +? Я заметил только для Fraction. Вот поэтому он и вызывается. Если бы ты его определил для ProperFraction, то было бы по-другому...
PM   Вверх
Lotles
  Дата 3.11.2010, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 6.4.2010

Репутация: нет
Всего: нет



Это получается и операторы не наследуются, ппс в учебнике написано только конструкторы не наследуются 
bsa двумя строками все мои вопросы снёс, и всё из-за элементарного непонимания  

Это сообщение отредактировал(а) Lotles - 3.11.2010, 07:38
PM MAIL Skype   Вверх
Lotles
Дата 3.11.2010, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 6.4.2010

Репутация: нет
Всего: нет



А нет, остался 1 вопрос
Вообще это не мой вопрос, случайно на форуме увидел и тоже стало интересно, правда на него не ответили 
Код

    ProperFraction operator+(const ProperFraction& other){
        return add(other);

Почему когда в функцию add передаем other не вызывается конструктор копирования(ответ: потому что other- ссылка)
А если так посмотреть, то в аргументе конструктора копирования 
Код

    ProperFraction(const Fraction& src){
        set(src.Fraction::get_num(), src.get_den());
    }

тоже сылка

Где то в книге читал, что вроде в конструкторе копирования аргумент является объектом, но какой это объект, если мы передаем указатель, он(src-аргумент) потом 
Код

        set(src.Fraction::get_num(), src.get_den());

превращается в объект(а точнее в данные, находящиеся по адресу)


Так почему когда в аргумент передаешь ссылку на объект не вызывается конструктор копирования ?

 


Это сообщение отредактировал(а) Lotles - 3.11.2010, 08:50
PM MAIL Skype   Вверх
mes
Дата 3.11.2010, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Lotles @  3.11.2010,  07:50 Найти цитируемый пост)
Так почему когда в аргумент передаешь ссылку на объект не вызывается конструктор копирования ?

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

Добавлено через 1 минуту и 23 секунды
"не ссылка" в данном контексте это объект пользовательского типа... 



--------------------
PM MAIL WWW   Вверх
xvr
Дата 3.11.2010, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Lotles @  3.11.2010,  07:30 Найти цитируемый пост)
Это получается и операторы не наследуются, 
Наоборот - наследуются. Если бы не наследовались, то получилась бы ошибка на этапе компиляции.

Цитата(Lotles @  3.11.2010,  08:50 Найти цитируемый пост)
А если так посмотреть, то в аргументе конструктора копирования тоже сылка
Правильно. И поэтому при вызове конструктора копирования для передачи ему параметра конструктор копирования еще раз не вызывается

И вообще - любой конструктор (в том числе и конструктор копирования) так просто (сам по себе) не вызывается, его вызов - это неотъемлемая часть создания нового объекта. Конструктор копирования вызывается как часть создания объекта - копии другого объекта. 
При передаче параметра (объекта) по значению (т.е. без всяких ссылок или указателей) как раз и создается копия


PM MAIL   Вверх
Lotles
Дата 4.11.2010, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 6.4.2010

Репутация: нет
Всего: нет



Код

    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;

Код

    return fract;

А зачем вообще делается копия, есть один fract , зачем еще делать ?


А this в конструкторе копирования чем является ?

А что вызвало 
Код

    ProperFraction(const Fraction& src){
        cout << "bla-bla-bla" << endl;
        set(src.Fraction::get_num(), src.get_den());
    }


Конструктор копирования вызывается в следующих случаях:
1) Когда объект передается в качестве возвращаемого значения функции
2) Когда один объект используется другого
3) Когда объект стоит в аргументе
Не один случай не подходит 

Это сообщение отредактировал(а) Lotles - 4.11.2010, 13:53
PM MAIL Skype   Вверх
xvr
Дата 4.11.2010, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Lotles @  4.11.2010,  12:17 Найти цитируемый пост)
А зачем вообще делается копия, есть один fract , зачем еще делать ?
Копия делается для передачи объекта fract наружу -  в место вызова. Сам этот объект не может использоваться в качестве результата, т.к. он является локальным в функции add и будет разрушен (вместе со стеком функции) когда она завершит свою работу. А результат должен быть доступен и после этого:
Код

Fraction a,b;

Fraction res=a.add(b);
// Конструктор копирования будет вызван для инициализации объекта res из объекта fract ВНУТРИ a.add


Цитата(Lotles @  4.11.2010,  12:17 Найти цитируемый пост)
Не один случай не подходит 
Как это не подходит, а п1?
Цитата(Lotles @  4.11.2010,  12:17 Найти цитируемый пост)
1) Когда объект передается в качестве возвращаемого значения функции




PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0871 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.