问题描述
- 求c++大牛帮助,一小段笔试代码,怎么都想不通
-
class Point{
private:
double X,Y;
public:
Point(double xx=0, double yy=0)
{
X=xx;
Y=yy;
cout<<"Point("<<X<<","<<Y<<")"<<endl;
}
Point(Point &p)
{
X=p.X;
Y=p.Y;
cout<<"Point is copied."<<endl;
}
double Distance(Point &p);};
double Point::Distance(Point &p)
{
double dx,dy;
dx = X - p.X;
dy = Y - p.Y;
return sqrt(dx*dx + dy*dy);
}
Point f(double x, double y)
{
Point P(x,y);
return P;
}
void main()
{
Point A(0,0);
Point &B = f(3,4); //这一行为什么会调用两次拷贝构造函数?
cout<<"Distance is "<<A.Distance(B)<<endl;}
以下是输出结果:
Point(0,0)
Point(3,4)
Point is copied.
Point is copied.
Distance is 5好像是调用了两次拷贝构造函数,我知道有一个返回的return P调用了一次,为何构造引用&B时还会调用?但这样的话下边的函数A.Distance(B)参数也会构造一次引用为啥不调用了呢?。。。。。好无语啊。。。。。考研试题,救救我这个考研狗吧。
解决方案
我上边发的是vc6调试的
用vs调试了一遍,就是调用一次了
这样输出
Point(0,0)
Point(3,4)
Point is copied.
Distance is 5
到底哪个才是正确答案啊?
解决方案二:
调用一次是对的。也许vc6没有优化。
解决方案三:
研究了好久原来是编译器的问题?
解决方案四:
#if 1
#include
using namespace std;
class Point{
private:
double X, Y;
public:
Point(double xx = 0, double yy = 0)
{
X = xx;
Y = yy;
cout << "Point(" << X << "," << Y << ")" << endl;
}
Point(Point &p)
{
X = p.X;
Y = p.Y;
cout << "Point is copied." << endl;
}
double Distance(Point &p);
};
double Point::Distance(Point &p)
{
double dx, dy;
dx = X - p.X;
dy = Y - p.Y;
return sqrt(dx*dx + dy*dy);
}
//Point f(double x, double y)
Point &f(double x, double y)
{
Point P(x, y);
return P;
}
void main()
{
Point A(0, 0);
Point &B = f(3, 4); //这一行为什么会调用两次拷贝构造函数?
cout << "Distance is " << A.Distance(B) << endl;
}
#endif
vc6.0没有优化开关,vs一定会给优化掉的,就是说vc6.0中函数返回时用P拷贝构造临时对象f(3,4); 然后用临时对象f(3,4)去初始化(掉拷贝构造)
B;所以调用了两次拷贝构造.... 而vs不这么干,他在函数返回的时候,先拷贝构造临时对象,并且将临时对象放入寄存器(缓存),初始化B的时候
直接在缓存里面取值就行,不会在一次去读取内存,减少时空效率上的开销,并且之所以敢这样是因为这样做的安全性使用不会被破坏的,像、
socket端口的一些操作就不能去被这样优化,会出问题的...