class-求c++大牛帮助,一小段笔试代码,怎么都想不通

问题描述

求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端口的一些操作就不能去被这样优化,会出问题的...

时间: 2024-08-22 07:21:03

class-求c++大牛帮助,一小段笔试代码,怎么都想不通的相关文章

代码 试题-一小段c++代码求大神教

问题描述 一小段c++代码求大神教 部分代码 Point f(double x, double y) { Point P(x,y); return P; } void main() { Point A(0,0); Point B = f(3,4); } Point是自定义的类 请问调用几次拷贝构造函数? 自己试过 .可是 vs调用了一次,vc调用了两次.哪个正确? 解决方案 1.应该是调用2次,vs调用一次,可能是Point A(0,0)被编译器优化掉了. 2.建议再main函数中添加对A进行访

c++基础c++-求大神写一段c++代码,做题能做对但是自己写代码就漏洞百出,求大神指导

问题描述 求大神写一段c++代码,做题能做对但是自己写代码就漏洞百出,求大神指导 年龄 Age姓名 char name公有成员函数: 构造函数 带参数的构造函数Student(int mchar); 不带参数的构造函数 Student() 析构函数 -Student() 改变数据成员值函数 void SetMemer(int mchar *) 获取数据成员函数 int GetAge() char * GetName()要求:在main()中定义一个有3个元素的对象数组并分别初始化,然后输出对象数

jquery-见鬼,太奇怪了,求大神解答这段js代码怎么得不到预期结果。

问题描述 见鬼,太奇怪了,求大神解答这段js代码怎么得不到预期结果. 本来要写一个滚动条到底部自动加载的功能,if里面的判断表达式结果确实是true但是if里面的代码被执行5次.设置全局变量,return false.....都没法解决这个问题.求js大神解答.该怎么写才合适. $(window).scroll(function(){ if (($(document).height())==($(window).height()+$(document).scrollTop())) { alert

spark1.2里的一小段scala代码看不懂

问题描述 spark1.2里的一小段scala代码看不懂 def map [ U : ClassTag ] ( f : T => U): RDD[U] = { val cleanF = sc.clean(f) new MapPartitionsRDD [ U , T ] ( this , ( context , pid , iter ) => iter.map(cleanF)) } RDD.scala里的这个方法里的context, pid, iter不知道从哪来的啊?? https://gi

懂PHP得帮下忙,求帮我把这段c#代码翻成php

问题描述 求高手帮忙把一段C#的程序翻译成PHPHttpWebRequestrequest=(HttpWebRequest)WebRequest.Create("http://......");request.Method="POST";request.KeepAlive=false;request.AllowAutoRedirect=true;request.ContentType="application/json";request.Acce

一小段Java代码求高手解释,严重求助!!!!!

问题描述 小弟我对Java一窍不通,惭愧,只学过VB,正在强化自己,下面的代码只看懂了一点,这段代码在VB.net中如何实现的?,求高手转换成VB代码好么!小弟不才,看懂的加了VB注释.数字转MD5后=7C6DF7FC35DDCF4AD9BE46F4FFDD58DE,从第13位开始取值12位等于CF4AD9BE46F4,最后的计算结果是661-273-276-329好像还有一个翻转函数publicstaticStringreverse(char[]paramArrayOfChar)小弟先谢谢大侠

有一小段程序怎么调试都不对,请高手指教

问题描述 <html><head><title>Ch2-5-4.aspx</title></head><body><%DimcounterAsInteger=1Dimcounter1,totalAsInteger'第一层循环DoWhilecounter<=10total=0Response.Write("计算1加到"&counter&"等于")'计算总和的第二层循环c

spark-一小段scala代码看不懂?

问题描述 一小段scala代码看不懂? def collect(): Array[T] = withScope { val results = sc.runJob(this, (iter: Iterator[T]) => iter.toArray) Array.concat(results: _*) } 里面的results是个数组Tuple3[n][] 问下Array.concat(results: _*)是什么意思啊?? 我想自己初始化一个Tuple3[n][],但是我不会初始化这个东西啊.

非常常用实用的10段 JavaScript 代码

avaScript正变得越来越流行,它已经成为前端开发的第一选择,并且利用基于JavaScript语言的NodeJS,我们也可以开发出高性能的后端服务,甚至我还看到在硬件编程领域也出现了JavaScript的身影.JavaScript正在逐渐进化为一门全能的开发语言. 但用好JavaScript并不容易,你除了需要掌握它的语法并知道如何写出高质量的代码之外,还需要了解如何解决那些几乎在每个项目中都会遇到的需求场景,比如:判断日期,高亮文本,限制字符数等等,有很多第三方库可以解决这些问题,但这些库