crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Конструкто копирования, в каких случаях должен вызываться?
kwisp
  опции профиля:
сообщение 14.6.2010, 14:20
Сообщение #1


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


# ifndef _PARENT_H_
# define _PARENT_H_


class Parent
{      

protected:
int m_id;

public:
        Parent():m_id(0)
        {
                std::cout<<__PRETTY_FUNCTION__<<"\n";
        }
        Parent(const int & id):m_id(id)
        {
                std::cout<<__PRETTY_FUNCTION__<<"\n";
        }
        Parent(const Parent& parent):m_id(parent.m_id)
        {
                std::cout<<__PRETTY_FUNCTION__<<"\n";
        }
        void setId(const int& id) {m_id = id;}
        Parent& operator=(const Parent& parent)
        {
                this->m_id = parent.m_id;
                std::cout<<__PRETTY_FUNCTION__<<"\n";
                return *this;
        }
};

# endif // _PARENT_H_

# include <iostream>
# include "parent.h"

Parent setParent(Parent parent)
{
        return parent;
}

Parent getParent(const int& i)
{
        Parent p(i);
        return /*Parent(i)*/p;
}

int main()
{
        //Parent parent(10);
        //setParent(parent);
        //parent = getParent(11);
        //return 0;
}

внимание вопросы:
1. сколько раз при вызове setParent(parent) вызовется конструктор копирования?
2. сколько раз при вызове getParent(11) вызовется конструтор копирования?

П.С.
если прилагаете к ответу консольный вывод программы указывайте пожалуйста версию компилятора и ОС.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 14.6.2010, 16:43
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


1) 2
2) 1
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 15.6.2010, 10:19
Сообщение #3


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Litkevich Yuriy,
проверял?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Влад
  опции профиля:
сообщение 15.6.2010, 12:36
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

Спасибо сказали: 46 раз(а)




Репутация:   8  


Юрий совершенно прав. Теоретически должно быть именно так.
На практике, однако, компилятору разрешено проводить RVO, поэтому реальные результаты могут отличаться от ожидаемых. Впрочем, это сильно зависит как от компилятора, так и от опций оптимизации. В чем же тогда смысл вопроса?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 15.6.2010, 12:52
Сообщение #5


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Влад,
вот и хотелось бы разобраться и с компилятором и с опциями оптимизации.

у меня на деле
1) 2
2) 0
!

П.С.
ну и чисто риторически как к примеру человеку не знакомому с С++ доказать и показать на практике как и что происходит. вот к примеру школьникам.

gcc версия 4.3.4
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.6.2010, 13:32
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(kwisp @ 15.6.2010, 14:19) *
проверял?
нет

видимо во втором случае, локальный объект не уничтожается, ради экономии времени и памяти, а просто возвращается ссылка на него.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Влад
  опции профиля:
сообщение 15.6.2010, 15:31
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

Спасибо сказали: 46 раз(а)




Репутация:   8  


kwisp:
У меня экспериментальные результаты таковы:

GCC 4.5 (и 4.4 тоже) выдает
1). 2
2). 0
как в режиме Debug, так и в режиме Release.

В отличие от него, MS Visual C++ 2005
в режиме Debug:
1). 2
2). 1
в режиме Release:
1). 2
2). 0

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 30.10.2020, 19:20