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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2012, 11:43   #1
Стремящийся
Форумчанин
 
Аватар для Стремящийся
 
Регистрация: 01.11.2011
Сообщений: 172
По умолчанию Перегрузка операции +

Всем привет!

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

Код:
Rational integer1( c, d ),h;// инициализация h ( здесь я понимаю почему вызывается конструктор)
	h=integer + integer1;// а почему вызывается здесь не пойму, ведь должен вызываться operator =
Модераторам: не срабатывает тэг #

Заранее спасибо!
Желание тысяча возможностей, нежелание - тысяча причин

Последний раз редактировалось Стремящийся; 06.05.2012 в 11:45. Причина: Не выделяется код
Стремящийся вне форума Ответить с цитированием
Старый 06.05.2012, 13:47   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

h какого типа? Rational?
Если мне не изменяет память "=" для объектов вызывает конструктор.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.05.2012, 14:39   #3
Стремящийся
Форумчанин
 
Аватар для Стремящийся
 
Регистрация: 01.11.2011
Сообщений: 172
По умолчанию

Спасибо. Да, Вы правы, h типа Rational. А вот когда пишешь

Код:
Rational integer1( c, d ),h=integer + integer1;
То конструктор вызывается один раз. Наверно, operator = все-таки вызывает конструктор. Подожду, может еще кто что скажет.
Желание тысяча возможностей, нежелание - тысяча причин
Стремящийся вне форума Ответить с цитированием
Старый 06.05.2012, 14:58   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

У меня вопрос: Почему создаешь объекты без использования new?
Я как-то не представляю программирование под ООП в Си без этого оператора. Т.е. не представляю себе как это - нет new и нет багов...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.05.2012, 15:12   #5
Стремящийся
Форумчанин
 
Аватар для Стремящийся
 
Регистрация: 01.11.2011
Сообщений: 172
По умолчанию

Я new никогда неиспользовал при создании. Наверно, привычка.

Динамически это так?:

Код:
Rational *h=new Rational
Желание тысяча возможностей, нежелание - тысяча причин
Стремящийся вне форума Ответить с цитированием
Старый 06.05.2012, 15:33   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да. Если в этой теме появятся мастера Си пусть пояснят в чем разница создания объекта и его "статической" описи.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.05.2012, 15:35   #7
Стремящийся
Форумчанин
 
Аватар для Стремящийся
 
Регистрация: 01.11.2011
Сообщений: 172
По умолчанию

Спасибо. Будем ждать!
Желание тысяча возможностей, нежелание - тысяча причин
Стремящийся вне форума Ответить с цитированием
Старый 06.05.2012, 16:15   #8
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Если объекты динамически не нужны, то лучше их так и не создавать, будет только медленнее, и, к тому же, захламлять память.
Цитата:
Я как-то не представляю программирование под ООП в Си без этого оператора.
Цитирую нашего препода по плюсам: "если вы будете нормально писать на с++, то вы не будете использовать new".
new и delete нужны только когда вы вручную работаете с памятью, что, как правило, и приводит к тысячам ошибок) Как правило, всё нужное вам уже написано.
А во второй строчке конструктор для h не вызывается. Он вызывается для временного объекта - результата суммы, а потом уже вызывается operator =.
Форматируйте код, будьте людьми.

Последний раз редактировалось Granus; 06.05.2012 в 16:18.
Granus вне форума Ответить с цитированием
Старый 06.05.2012, 19:17   #9
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
в чем разница создания объекта и его "статической" описи.
Создание объекта с использованием new подразумевает размещение объекта в динамической памяти (куче), и позволяет вручную контролировать время жизни. Когда объект не нужен используется detete.
Статическое создание объекта (без использования new) подразумевает размещение объекта в стеке, и автоматическое удаление его при выходе переменной из области видимости.

Как правило, локальные объекты создаются статически, ибо нет никаких причин размещать их в куче.
Но есть случаи, когда создание объектов статически невозможно. Например, если у вас есть абстрактный базовый класс (интерфейс), и несколько производных классов:
Код:
class Base
{
public:
  virtual void Func() const = 0;
};

class Child1: public Base
{
  virtual void Func() const
  {
    // implement
  }
};

class Child2: public Base
{
  virtual void Func() const
  {
    // implement
  }
};
Для получения объекта с интерфейсом Base необходимо создать объект, реализующий этот интерфейс:
Код:
void Create()
{
  Base* obj1 = new Child1();
  Base* obj2 = new Child2();
}
Далее можно вызвать у каждого объекта интерфейсную функцию, при этом будет вызвана соответствующая функция конкретного наследника:
Код:
int main()
{
  std::vector<Base*> collection;
  // заполнение вектора

  for (std::vector<Base*>::const_iterator it = collection.begin(); it != collection.end(); ++it)
  {
    it->Func();
  }
}
При окончании работы с этими объектами необходимо освободить память, используя delete. Но лучше использовать для этой цели принцип RAII, например с помощью std::auto_ptr (пример я недавно приводил тут: http://www.programmersforum.ru/showp...79&postcount=2)
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 06.05.2012, 19:26   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Понятно. Попробую избавиться от привычки везде new пхать.
P.S. Сорри что влез в чужую тему.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перегрузка операции * Maygli Помощь студентам 0 25.04.2012 13:33
Перегрузка операции ввода sawyer1988 Общие вопросы C/C++ 5 22.04.2012 11:59
Перегрузка операции Evgen.O C++ Builder 0 11.12.2011 17:42
перегрузка операции со счетом zhenya.ya Общие вопросы C/C++ 0 03.10.2010 23:52
Перегрузка операции "->*" C++ Geg[C/c++] Общие вопросы C/C++ 3 15.12.2009 12:49