Тема: Що відбувається в цьому коді?

Я щось повністью заплутався, коли що поисходить. Коли по перше создається обьєкт point1
звється конструктор у якому this вказує на саме на нього.
У перевантажєному конструкторі this вказує ще кудись.Змінні dX і dY самє обьєкту point1
вжє обнульовані.  17:33 13.02.2015

Як точнисинько вивести строго ті змінні??   Справа взагалі у тому що що ж і як воно відбувається?
18:41 13.02.2015



Відбувається плутанина високого рівню! Трапляється дийсно щось незрозуміле!

Хотілося б запамятати в масив покажчик на кожного створюємого тут обьекту, і
а ще краще і змінні належачи кожному обїьекту!
11:58 14.02.2015


#include <stdlib.h>
#include <stdio.h>
#include <iostream>



 
class Point
{
public:
    Point();
    Point(float dX, float dY);
 
    float dX;
    float dY;
    float dX1;
    float dY1;
     void Funk()
         {
          std::cout << "dX " << dX << std::endl;
          std::cout << "dY " << dY << std::endl;
          std::cout << "dX1 " << dX1 << std::endl;
          std::cout << "dY1 " << dY1 << std::endl;
         }
   
     int*х[10];

};

    int Gl=0;    
 
Point::Point()
{
    std::cerr << "New object at address " << this << std::endl;

    //this.Funk(); бо це не компилюється

    //х[Gl] = this;

    Gl++;


    Point::Point(0, 0);
}
 
Point::Point(float dX, float dY)//Витікає що досить присвоїти ось так
{
    std::cerr << "New object1 at address " << this << std::endl;
    this->dX1 = dX;// Відбувається присвоєння значення з  обьёкту point1 до невідомого обь?кту
    this->dY1 = dY;// Як цє взагалі відбувається? Тобто тут dY відноситься 
    // до обєкту point1 тоді як dX1 на який вказує this-> до ще якогось другого та третього обЇектив.
    // Тобто при кожному виклику конструктора this вказує на щось нове.
}



 
void main()
{
    Point point1;
 
    point1 = Point(10, 10);
    printf("&point1 = %x; x=%f, y=%f\n, x1=%f, y1=%f\n", &point1, point1.dX, point1.dY, point1.dX1, point1.dY1);
    //point1.Funk();
    
    point1 = Point();
    printf("&point1 = %x; x=%f, y=%f\n, x1=%f, y1=%f\n", &point1, point1.dX, point1.dY, point1.dX1, point1.dY1);
 
    getchar();
 
    return;
}

Re: Що відбувається в цьому коді?

Будь ласка, скомпілюйте цей код і виконайте! Розумію що робиться все не так, але цікаво ж до мурашок на спині. Що ж тут відбувається??

3

Re: Що відбувається в цьому коді?

Казав же я вам - не лізте в плюси бо, складно буде - читайте по чистим сям. А ви не послухали мене і тепер наіндуслити такий код, що його дію самі не розумієте:

 point1 = Point(10, 10);

Для створення об’єкту(виділення для нього шматка пам’яті і виклику констркутора) треба оператор new

 point1 = new Point(10, 10);

4 Востаннє редагувалося Yola (14.02.2015 15:10:22)

Re: Що відбувається в цьому коді?

0xDADA11C7 написав:

*

А чим погано

point1 = Point(10, 10);

що, клас Point не має конструктора копіювання за умовчанням? Більше того

   Point point1;
   point1 = Point(10, 10);

тотожно до

   Point point1(10, 10);

бо компілятор оптимізує.

Дмитро-Чебурашка написав:

*

Щодо

//this.Funk(); бо це не компилюється

то this це вказівник, тобто доступатись до членів можна через оператор ->.

Також спробуйте

Point*х[10];
Подякували: Дмитро-Чебурашка1

5

Re: Що відбувається в цьому коді?

Будь ласка, замість "не компілюється" описуйте конкретні повідомлення компілятора помилки, інакше допомогти вам буде неможливо. Те саме стосується "чогось незрозумілого" - пишіть, що ви очікуєте, і що отримуєте.

Подякували: Дмитро-Чебурашка1

6 Востаннє редагувалося Дмитро-Чебурашка (14.02.2015 18:22:46)

Re: Що відбувається в цьому коді?

Дуже цікаво було б написати код так, що б кожного разу, коли кличється конструктор або конструктор копіювання покажчик на обїєкт, на який вказує покажчик this, зберігався в масив покажчиків.
Чи можна це зробити? Я не сильно закрутив?

7 Востаннє редагувалося Yola (14.02.2015 18:58:10)

Re: Що відбувається в цьому коді?

Та можна, але навіщо вам це потрібно, розкажіть ціль, може є елегантніший спосіб її досягти.

Re: Що відбувається в цьому коді?

    int Gl=0; const Point*х[10];   
 
Point::Point()
{
    std::cerr << "New object at address " << this << std::endl;

    //this.Funk(); бо це не компилюється

    //х[Gl] = this;

    const Point*х[Gl];

    Gl++;


    Point::Point(0, 0);
}
 
Point::Point(float dX, float dY)//Витікає що досить присвоїти ось так
{
    std::cerr << "New object1 at address " << this << std::endl;
    this->dX1 = dX;// Відбувається присвоєння значення з  обьёкту point1 до невідомого обь?кту
    this->dY1 = dY;// Як цє взагалі відбувається? Тобто тут dY відноситься 
    // до обєкту point1 тоді як dX1 на який вказує this-> до ще якогось другого та третього обЇектив.
    // Тобто при кожному виклику конструктора this вказує на щось нове.
}

Ошибка    1    error C2057: требуется константное выражение    d:\rozbir\class_point\pytannya\pytannya\pytannya.cpp    41    1    Pytannya
Ошибка    3    error C2133: х: неизвестный размер    d:\rozbir\class_point\pytannya\pytannya\pytannya.cpp    41    1    Pytannya
Ошибка    2    error C2466: невозможно выделить память для массива постоянного нулевого размера    d:\rozbir\class_point\pytannya\pytannya\pytannya.cpp    41    1    Pytannya

Re: Що відбувається в цьому коді?

Хочу розібрати по кісточках і атомах, що відбувається. Як відбувається і куди посилається.

Подякували: koala1

Re: Що відбувається в цьому коді?

Скомпилювалось!!

Re: Що відбувається в цьому коді?

О як прикольно!!!

Re: Що відбувається в цьому коді?

#include <stdlib.h>
#include <stdio.h>
#include <iostream>



 
class Point
{
public:
    Point();
    Point(float dX, float dY);
 
    float dX;
    float dY;
    float dX1;
    float dY1;
     void Funk()
         {
          std::cout << "dX " << dX << std::endl;
          std::cout << "dY " << dY << std::endl;
          std::cout << "dX1 " << dX1 << std::endl;
          std::cout << "dY1 " << dY1 << std::endl;
         }
   
     //int*х[10];
    

};

int Gl=0; const Point*х[10];   float y[4][10];
 
Point::Point()
{
    std::cerr << "New object at address " << this << std::endl;

    //this.Funk(); бо це не компилюється

    х[Gl] = this; y[Gl][0]=this->dX;y[Gl][1]=this->dY;y[Gl][2]=this->dX1;y[Gl][3]=this->dY1;

     //х[Gl];

    Gl++;


    Point::Point(0, 0);
}
 
Point::Point(float dX, float dY)//Витікає що досить присвоїти ось так
{
    std::cerr << "New object1 at address " << this << std::endl;
    this->dX1 = dX;// Відбувається присвоєння значення з  обьёкту point1 до невідомого обь?кту
    this->dY1 = dY;// Як цє взагалі відбувається? Тобто тут dY відноситься 
    // до обєкту point1 тоді як dX1 на який вказує this-> до ще якогось другого та третього обЇектив.
    // Тобто при кожному виклику конструктора this вказує на щось нове.

    х[Gl] = this; y[Gl][0]=this->dX;y[Gl][1]=this->dY;y[Gl][2]=this->dX1;y[Gl][3]=this->dY1;

    Gl++;

}



 
void main()
{
    Point point1;
 
    point1 = Point(10, 10);
    printf("&point1 = %x; x=%f, y=%f\n, x1=%f, y1=%f\n", &point1, point1.dX, point1.dY, point1.dX1, point1.dY1);
    //point1.Funk();
    
    point1 = Point();
    printf("&point1 = %x; x=%f, y=%f\n, x1=%f, y1=%f\n", &point1, point1.dX, point1.dY, point1.dX1, point1.dY1);
 

    std::cout << "           "  << std::endl;
    std::cout << "           "  << std::endl;

    for (int i=0;i<=9;i++)
    {
std::cerr << "  address " << х[i] << std::endl;
    printf ("i %i "" %с x %p",i," Obyekt     ",х[i]);  
    std::cout  << "  "<< y[i][0]<< "  " <<y[i][1] << "  "<<y[i][2] << "  " <<y[i][3] <<  std::endl;
    }
    getchar();
 
    return;
}


Котрого дня по півтори-дві години розбираю дію цього коду.
Ну подобається мені мучити компілятор і намагатися зрозуміти!
Хочеться розібрати все-таки на кістці, на атоми. хочеться зрозуміти що і як працює.

Привітаються звичайно ж методи і засоби як це усе вивести засобами того ж коду, що б зрозуміти в усіх деталях що і як відбувається.
І, показати різні хитрощі і приклади гарного коду.

Взагалі то не дивно, що я розбираюся з усім цим. Що б стати справжнім програмістом, необхідно зрозуміти усі деталі!

Як же методами плюсов вивести усі детали роботи коду, що б усе бачити??




перша частина путаного мараледонського балету ( слова вчительки по математиці )






   Конструктор

Створюється об'єкт - this 0x0012ff54 {dX=-1.0737418e 008 dY=-1.0737418e 008 dX1=-1.0737418e 008 ...} Point * const
Видимий у конструкторі.
Усі змінні - 1.0737418e 008 float.
Що тут лежить в - х 0x004191d8 class Point const * * х const Point *[10] ?????
У Point * х[0] пишемо відповідно.

   Конструктор копіювання

В конструкторі копіювання покажчик тхис вказує мабуть на іншій обьект, 0012fd58.
змінні dX і dY 0.00000000 float.
змінні dX1 і dY1 - 1.0737418e 008 float.
І тут!!! Змінні обїекту 0x0012ff54 становляться dX1 і dY1 0.00000000 float !!!!!!
Одночасно, так, одночасно міняються змінні попереднього обєкту 0012fd58.
Тобто навпаки. Тобто хоч як, а змінюються вони одночасно!!!!!
Тобто тепер - this 0x0012fd58 {dX=-1.0737418e 008 dY=-1.0737418e 008 dX1=0.00000000 ...} Point * const
А у найпершому обьекті 0x0012ff54 тепер dX=0.00000000 dY=0.00000000 dX1=0.00000000 dY1=0.00000000
Чудеса!!!!!!

Ні!!!! Змінні обьекту 0x0012ff54 (1) в конструкторі копіювання вже інші. Тобто
dX=0.00000000 dY=0.00000000 dX1=-1.0737418e 008 dY1=-1.0737418e 008 float.
Що й не дивно бо вони прописані так Point::Point (float dX, float dY).
Дія відбувається зі змінними обїекту (2) 0x0012fd58.

Трохи зрозуміло!

Ні, не дуже. Й таки змінні dX1 і dY1 обох обїектив (1) і (2) зминюються одночасно.
Цікаво!!!!



void main ()
Виконуємо point1 = Point (10, 10); І ось мі вже стрибаємо
у конструктор копіювання.



Конструктор копіювання

- this 0x0012fe58 {dX=-1.0737418e 008 dY=-1.0737418e 008 dX1=-1.0737418e 008 ...} Point * const
Це вже третій обьект!! 0x0012fe58 (3). Ось маємо.
А де, яки зминні мають 10??  Де???????   Де вони?????????? 

Або тут є ще деякий прихований обьект який ми не бачимо???
Точно, точно є ще обьект, все чотири змінні якого у кінці конструктора копиювання
мають значення 10.0000000  !!!!!!!!!!!!!!!!!!!!!!!!!!!


void main ()

Власне обьект point1 має параметри
0x0012ff54 (1) - &point1 0x0012ff54 {dX=-1.0737418e 008 dY=-1.0737418e 008 dX1=10.000000 ...} Point *

Виконуємо point1 = Point (); Зараз опинимося в конструкторі.




Конструктор

ОО!! - this 0x0012fe70 {dX=-1.0737418e 008 dY=-1.0737418e 008 dX1=-1.0737418e 008 ...} Point * const

Тобто 0x0012fe70 (4).
До речі, усі ці 4 обїекти вже записані почерзі у const Point*х[10].

Конструктор копіювання

Показчик this вказує на -        this    0x0012fd58 {dX=-1.0737418e+008 dY=-1.0737418e+008 dX1=-1.0737418e+008 ...}    Point * const
Офигєть!!!!!   Адреса цього обїекту- це наша стара знайома адреса!!!  Це (2) і цей обїект є там де і був!

Я схильний думати що при виході з конструктора копіювання цей обьект (2) був знищений
звичайно ж деструктором, і тепер створений наново! Сто пудів тобто!

А ось тут this ->dX1 = dX; і тут this ->dY1 = dY;
ми привласнюємо значення 0.0000000 змінним dX1 і dY1
обьектов - this 0x0012fd58 {dX=-1.0737418e 008 dY=-1.0737418e 008 dX1=0.00000000 ...} Point * const
і. ммм. попєреднього обьекту 0x0012fe70 {dX=0.00000000 dY=0.00000000 dX1=0.00000000 ...} Point * const

Також одночасно.


void main ()

for (int i=0;i<=9;i )

- point1 {dX=-1.0737418e 008 dY=-1.0737418e 008 dX1=-1.0737418e 008 ...} Point

Офигєть!!! Офигєть!!! це який обьект ми маємо???????????

х[0] містить 0xcccccccc
х[1] містить 0xcccccccc
х[2] містить 0x00000000
х[3] містить 0x00000000
[4] містить 0x0012fd58

І далі містить нулі. А де ж все? Що ж і куди ми писали?? Жах.

Адже писали, бо х[4] є.

Якщо в майне ми завжди бачимо 0x0012ff54 (1) те все одно нічого не зрозуміло.

Re: Що відбувається в цьому коді?

Друга частина маралєдонського балету.

  (Переписав код наново сьогодні вже з деструкторами, але тє ж саме.)





......Ще раз і повильно



    Конструктор

-        this    0x0012ff48 {dX=-1.0737418e+008 dY=-1.0737418e+008 dX1=-1.0737418e+008 ...}    Point * const



   Конструктор копіювання


-        this    0x0012fd48 {dX=-1.0737418e+008 dY=-1.0737418e+008 dX1=-1.0737418e+008 ...}    Point * const
Спочатку конструктора

-        this    0x0012fd48 {dX=-1.0737418e+008 dY=-1.0737418e+008 dX1=0.00000000 ...}    Point * const
У кінці конструктора





     Майн

-        &point1    0x0012ff48 {dX=-1.0737418e+008 dY=-1.0737418e+008 dX1=-1.0737418e+008 ...}    Point *



    Конструктор копіювання 


-        this    0x0012fe4c {dX=-1.0737418e+008 dY=-1.0737418e+008 dX1=-1.0737418e+008 ...}    Point * const
спочатку конструктора
-        this    0x0012fe4c {dX=-1.0737418e+008 dY=-1.0737418e+008 dX1=10.000000 ...}    Point * const
У кінці конструктора

Добре. Але в конструкторі копіювання від якого такого обьекту привласнювалося 10 в змінні, або як?






     Майн

-        &point1    0x0012ff48 {dX=-1.0737418e+008 dY=-1.0737418e+008 dX1=10.000000 ...}    Point *

Ось так таки!! Може бути, в конструкторі копіювання я бачив цього найпершого обїекту?
Теж мабудь що ні, тому що змінні dX і dY залишилися дорівнювати цьому біс ті чому.
Якщож у конструкторі копиювання при цьому this->dX1 = dX;передавалося значення
з першого обїекту 0x0012ff48 до this    0x0012fe4c то тоді б звичайно змінні dX
вже повинні були б доривнювати десятці!
А як взагалі сюди потрапили значення змінних? Адже в конструкторі копіювання
покажчик тхис показував на 0x0012fe4c, і з ним ми щось там робили.
Подальша доля обьекта 0x0012fe4c - він знищений деструкцією.

Досить!1 Нічого не зрозуміло, якщо детально.

14

Re: Що відбувається в цьому коді?

Яке емоційне в вас знежучення :D Раджу дивитися одразу в асемблерний код чи принаймні поряд держати його лістинг.

Подякували: Дмитро-Чебурашка1

15

Re: Що відбувається в цьому коді?

Те що ви дивитеся для вас занадто складне, тому по-перше розберіться як вмикати символи в компілері, по-друге йдіть до мети поступово. Тобто спочатку скомпілюйте hello world і читайте як воно працює... А як насобачитеся і знатимете різні угоди виклику функцій (thiscall, stdcall, ccall) і апішки вінди, то перейдете тоді до розгляду реалізації плюсових класів. Бо знання має бути системним, тоді воно стає набагато корисніше і заповнення прогалин не відволікає від роботи.

Подякували: Дмитро-Чебурашка1

Re: Що відбувається в цьому коді?

0xDADA11C7 написав:

Яке емоційне в вас знежучення :D Раджу дивитися одразу в асемблерний код чи принаймні поряд держати його лістинг.

Дуже дякую!  Це найкраще!