LINUX.ORG.RU

C++ [part2]


0

0

Пожалуйста, не пинайте :( не понимаю вот чего :
#include <iostream>
using namespace std;

class A
{
    public:
        A(){i = 0; cerr << " A(0) ";}
        A(int b){i = b;cerr << " A(" << i << ") ";}
        ~A(){cerr << " ~A(" << i << ")\n";}
        A  (const A& b) {i = b.i;cerr << "copy(" << i << ") ";}
        bool operator==(const A& a){return i == a.i;}
        const A &operator=( const A &r )
        {
            if( *this == r )
            {
                cerr << " ravni ";
            }
            else
            {
                i = r.i;
                cerr << " =(" << i << ") ";
            }
            return *this;
        }
        void f(){cerr << " f(" << i << ") ";}
        void set(const int &b){i = b; cerr << " set(" << i << ") ";}
    private:
        int i;
};

A func()
{
    A oder(6);
    return oder;
}

int main()
{
    A b = func();
    b.f();
    return 0;
}

rezalt :
 A(6)  f(6)  ~A(6)
А я думал что при return'е в func oder копируется 
с помощью копирования(выведется copy(6) ) и уничтожится как
переменная у которой закончилось время жизни ...
А тут получается что oder и b это один и тот же объект?
Объясните пожалуйста.
anonymous

Получается присваевание результата func в объект b типа A.
Почему один объект то? просто естественно у тебя там получаются одинаковые значения.
У тебя же не ссылка возвращается вроде.

godexsoft
()

Блин! У тебя в operator= сравниваются объекты на равенство, а нужно - 
указатели:
Вместо 
if( *this == r )
нужно 
if(this == &r)

Далее:
    A b = func(); 
Здесь инициализация с помощью конструктора копирования результатом 
из функции. Если хочешь, чтобы был operator=, то нужно писать 
 explicit A(const A&);


Flogger_d
()
Ответ на: комментарий от Flogger_d

так у меня же описан конструктор копирования или я его не правильно описал?

anonymous
()
Ответ на: комментарий от Flogger_d

>Блин! У тебя в operator= сравниваются объекты на равенство, а нужно - указатели:

Кому нужно?

operator== переопределен и его применение в данном случае имеет право на существование.

anonymous
()
Ответ на: комментарий от Flogger_d

>Далее:
>    A b = func(); 
>Здесь инициализация с помощью конструктора копирования результатом 
>из функции.

Конструктор копирования не вызывался. Именно это и удивило автора поста.

anonymous
()

>Объясните пожалуйста.

Весь ход твоих рассуждений верен, но в них вмешался умный компилятор, и подставил func инлайном. Расскажи, какой компидятор и с какими опциями использовался.

anonymous
()
Ответ на: комментарий от anonymous

g++ (GCC) 3.3.3 (SuSE Linux) опций не использовал никаких.
Но сейчас попробовал с -O0 ... всеравно то же самое ... 
а я думал O0 не разрешает компилятору "быть умным"
каким способом можно "заставить" его быть не умным.

anonymous
()
Ответ на: комментарий от anonymous

> g++ (GCC) 3.3.3 (SuSE Linux) опций не использовал никаких.

Да ... ну тогда, я тоже ничего не понимаю ;-((

anonymous
()
Ответ на: комментарий от anonymous

А кто нибудь что нибудь понимает? Дело в том что в оффтопике на билдере точь такой же исходник ... все было ок. :(

anonymous
()
Ответ на: комментарий от anonymous

>билдере точь такой же исходник ... все было ок. :(

Под "ок" ты понимаешь поведение с удалением временного объекта и копированием?

То, что делает gcc, нельзя назвать неправильным, но для меня стало сюрпризом, что он так поступает даже при отсутствии флагов оптимизации.

anonymous
()
Ответ на: комментарий от anonymous

да я понимал именно это ... сюрпризы-сюрпризы ... всем спасибо.

anonymous
()

Не знаю в чём причина, но у меня вывод так. [t@t tmp]$ ./a.out A(6) copy(6) ~A(6) f(6) ~A(6)

ОС Linux t 2.4.27 #1 SMP Mon Aug 16 09:59:04 MSD 2004 i686 unknown

anonymous
()
Ответ на: комментарий от anonymous

вот этого вывода я и ожидал :(

anonymous
()
Ответ на: комментарий от anonymous

>ОС Linux t 2.4.27 #1 SMP Mon Aug 16 09:59:04 MSD 2004 i686 unknown

А компилятор какой ? версия ?

Вот в этом обсуждении http://forum.sources.ru/index.php?showtopic=60470&hl=12 в конце приводится выдержка из стандарта, вроде как компилятор имеет полное право не создавать временный объект в этом случае.

Vinick ★★
()

Погугли по ключевому слову RVO return value optimization. Это нормально. И разрешено стандартом С++.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.