Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Конструкто копирования
Форум на CrossPlatform.RU > Разработка > С\С++
kwisp
# 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
1) 2
2) 1
kwisp
Litkevich Yuriy,
проверял?
Влад
Юрий совершенно прав. Теоретически должно быть именно так.
На практике, однако, компилятору разрешено проводить RVO, поэтому реальные результаты могут отличаться от ожидаемых. Впрочем, это сильно зависит как от компилятора, так и от опций оптимизации. В чем же тогда смысл вопроса?
kwisp
Влад,
вот и хотелось бы разобраться и с компилятором и с опциями оптимизации.

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

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

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

видимо во втором случае, локальный объект не уничтожается, ради экономии времени и памяти, а просто возвращается ссылка на него.
Влад
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

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.