C++中的构造与析构有关问题

C++中的构造与析构问题
#include<iostream>
using namespace std;
class Point
{
public:
Point(int=0,int=0);
Point(const Point&);
void display();
~Point();
private:
int x,y;
};
Point::Point(int a,int b)
{
x=a;
y=b;
cout<<"构造:";
display();
}
Point::~Point()
{
cout<<"析构:";
display();
}
Point::Point(const Point &p)
{
x=p.x;
y=p.y;
cout<<"拷贝构造:";
display();
}
void Point::display()
{
cout<<"("<<x<<","<<y<<")"<<endl;
}
Point func(Point p)
{
int a=20,b=20;
Point pp(a,b);
return pp;
return 0;
}
int main()
{
Point p1(3,4);
Point p2=p1;
p2=func(p1);
return 0;
}


结果为:
    构造:<3,4>
    拷贝构造: <3,4>
    拷贝构造: <3,4>
    构造: <20,20>
    拷贝构造:<20,20>
    析构:<20,20>
    析构:<3,4>
    析构:<20,20>
    析构:<20,20>
    析构: <3,4>


为什么不是这样对称的:
    构造: <3,4>
    拷贝构造:<3,4>
    拷贝构造: <3,4>
    构造:<20,20>
    拷贝构造:<20,20>
    析构:<20,20>
    析构:<20,20>
    析构: <3,4>
    析构: <3,4>
    析构: <3,4>
------解决方案--------------------
楼主会debug吗?
知道什么是栈不?
------解决方案--------------------
#include<iostream>
using namespace std;
class Point
{
public:
Point(int=0,int=0);
Point(const Point&);
void display();
~Point();
private:
int x,y;
};
Point::Point(int a,int b)
{
x=a;
y=b;
cout<<"构造:";
display();
}
Point::~Point()
{
cout<<"析构:";
display();
}
Point::Point(const Point &p)
{
x=p.x;
y=p.y;
cout<<"拷贝构造:";
display();
}
void Point::display()
{
cout<<"("<<x<<","<<y<<")"<<endl;
}
Point func(Point p) //3 传值的时候调用了拷贝构造 3,4  把p1赋值给临时变量p
{
int a=20,b=20; 
Point pp(a,b); //4 拷贝构造 20,20
return pp; //5 返回pp调用拷贝构造函数 20,20    给一个临时变量我们假设为x     
return 0;// 这个不会执行到
}//6 函数结束  函数内的变量被析构   先析构pp 20,20,再析构临时变量p 3,4
int main()
{
Point p1(3,4);   //1  构造3,4
Point p2=p1; //2 拷贝构造 3,4
p2=func(p1); //6 调用默认赋值函数,把x的值位拷贝给p2
int a;
a = 0; //7 这个是我添加为了debug用的,x临时变量,已经完成使命,析构x 20,20
return 0;
}//8 程序结束析构p2 20,20   接着析构p1 3,4

------解决方案--------------------
引用:
楼主会debug吗?
知道什么是栈不?
真理!
------解决方案--------------------
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?

不要写连自己也预测不了结果的代码!