#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) те все одно нічого не зрозуміло.