LINUX.ORG.RU

C++


0

0

Кто объяснит мне это
bash-2.05b$ cat main.cpp
#include <iostream>
using namespace std;
struct A
{
    int i;
    A(int i):i(i)
    {
        cerr << "A(int i) "<< i  << endl;
    }
    A():i(0)
    {
        cerr << "A"  << endl;
    }
    ~A()
    {
        cerr << "~A " <<i << endl;
    }
    A(const A& a)
    {
        cerr << "A(const A& a)"  << endl;
    }
    void f()
    {
        cerr << "f() " <<i << endl;
    }
};
    A b;
main()
{
    b.f();
    b=A(1);
    b.f();
}
bash-2.05b$ g++ main.cpp
bash-2.05b$ ./a.out
A
f() 0
A(int i) 1
~A 1
f() 1
~A 1
bash-2.05b$
anonymous

а что смущает?? по моему все тривиально:

> A
это сработал дефолтный ктор глобальной A b;

> f() 0
это ты вызвал f(), содержимое естественно 0.

> A(int i) 1
это создалась временная переменная в правой части присваивания: b = A(1);

дальше произошло покомпонентное дефолтное присваивание b = временная переменная.

> ~A 1
это разрушилась временная переменная

> f() 1
так как b уже присвоилась, то в ней 1.

> ~A 1
main завершился и глобальная переменная разрушилась.

Если ты уберешь printf (побочный эффект) и скомпилирешь с оптимизацией, то компилятор будет свободен не выполнять не нужных вызовов, то есть код должен быть такой же как и с простыми интами.

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

вместо b = A(1) можешь попробовать new( &b )( A )( 1 );

нужно только #include <new> для этого.

dilmah ★★★★★
()

b=A(1); Ты не перегрузил оператор присваивания, а сделал только конструктор копирования. При присваивании наверное происходит побитовое копирование и разрушение временной переменной, но так, как твоя программа быстро закончилась ты не увидел последствий того что b работает с освобоженной областью памяти, но если программа будет чуть посложнее то ты будешь сильно удивлен, почему программа ведет себя странно.

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

?????

In example above no free-store memory is used. The above post is pure bullshit. Do not believe it.

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