问一个神级小白有关问题,头都大了。

问一个神级小白问题,头都大了。。
问一个神级小白有关问题,头都大了。
我这样还找到了工作? 还找到了工作?一段代码看不懂~!问一个神级小白有关问题,头都大了。



// Test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;
class Location{
public:
Location(int a, int b)
{
     x=a;y=b;
cout<<"Executing constructor1"<<endl;
        cout<<"x"<<x<<"y="<<y<<endl;

}

Location(const Location &p)
{
x=p.y; y=p.x;
cout<<"Executing constructor2"<<endl;
cout<<"x="<<x<<"y="<<y<<endl;

}

~Location()
{
cout<<"Executing destructor"<<endl;
}

double getx()
{
return x;
}
double gety()
{
return y;
}

private:
int x;
int y;
};

Location fun(Location p)
{
int x, y;
x=p.getx()+1;
y=p.gety()+1;
cout<<"x="<<x<<"y="<<y<<endl;
return p;
}





int _tmain(int argc, _TCHAR* argv[])
{  

Location p1(5,18);

Location p2=fun(p1);
getchar();
return 0;
}




这事运行结果:

问一个神级小白有关问题,头都大了。

问题如下:
为什么 x=18;y=5? 什么时候互换了 X,Y的值?

然后  什么时候 x=5  y=18了?;为什么 location(const location &p)执行了两次?

o(︶︿︶)o 唉。。。越学越糊涂。
或者说,我之前学的都是白学了?

------解决方案--------------------
这个时候换了值
x=p.y; y=p.x;

------解决方案--------------------
引用:
问一个神级小白有关问题,头都大了。
快点来人啊,速度问完给分后 删帖了。,,不活了啊~!


Location(const Location &p)
    {
        x=p.y; y=p.x;
        cout<<"Executing constructor2"<<endl;
        cout<<"x="<<x<<"y="<<y<<endl;
 
    }

//这里的拷贝构造函数把值对换了啊,
//拷贝构造函数会构造临时对象的!


------解决方案--------------------
Location p2=fun(p1);
这一句就让拷贝构造调用了两次。
第一次是传参,由于参数是值传递,所以传参的时候实际上是拷贝了一个p1,调用了一次。

之后是返回值,fun的返回值赋值给p2的时候,又拷贝了一遍。

而你拷贝构造函数内部这么交换了x,y的值:
 x=p.y; y=p.x;
所以虽然在fun函数内部打印的时候你的值被交换了,但你返回值赋值给p2又调用拷贝构造,所以又给交换回来了。