point p2(p1);//拷贝生成p2,调用一次,加10
f(p2);//传入参数时,拷贝了一次再加10。如果改成引用可以避免:void f(point p) 改为void f(point& p)
//但是,注意调用非引用版f(p2)时并没有改变p2的值,只是f复制了一份操作,这跟函数交换两个数需要用指针做参数是一个道理
p2=g();//首先,g()函数里面返回参数时,拷贝了一次,加10;然后p2=赋值时再拷贝一次,再加10(注:这一步有些编译器会优化,减少拷贝次数,有些不会)
//这里,你也可以把g()改一下,return q;改成return &q;试试,就不会拷贝返回,不过这样做不安全,正式写代码的时候不推荐
//如果是楼上这位说的,是精度问题,可以在cout前加上两句:cout.setf(ios::fixed); cout.precision(1);
最后,打个广告,欢迎到我空间提问,或qq提问,qq号在空间里可以找到
c++函数调用是值传递,所以执行f(p2)操作的是p2的副本,而产生p2的副本会调用拷贝构造函数,于是就有了那样的结果,你把f的参数弄成引用就不会有复制过程了:void f(point& p)
至于输出不是小数,cout默认不输出无效数字,比如cout<<3.0f,会输出3
cout.setf(ios::showpoint); //这样可以强制输出小数