c++ 2015-11-01 07:58 采纳率: 66.7%
浏览 2191
已采纳

c++友元函数形参的问题

友元类函数的定义是 friend double dist(Point &p1,Point &p2);
但是 把&去掉 friend double dist(Point p1,Point p2);
不会提示错误 反而调用了复制构造函数是为什么?

#include
#include
using namespace std;

class Point
{
public:
Point (int x=0,int y=0):x(x),y(y)
{
cout<<"构造函数被调用"<<endl;
}
Point (Point &p)
{
cout<<"复制构造函数被调用"<<endl;
x=p.x;
y=p.y;
}
friend double dist(Point &p1,Point &p2);
private:
int x,y;
};

double dist(Point &p1,Point &p2)
{
double x=p2.x-p1.x;
double y=p2.y-p1.y;
return sqrt(x*x+y*y);
}
int main()
{
Point mp1(1,1),mp2(4,5);
cout<<"len=";
cout<<dist(mp1,mp2)<<endl;
return 0;
}

  • 写回答

2条回答 默认 最新

  • Malloc_New 2015-11-01 08:24
    关注

    把&去掉之后,在函数调用过程中,参数传递就是复制要传入的参数生成另外一个变量(要构造一个变量所以要调用构造函数)传入函数(此处为友元函数,其他函数也是这样子)。
    函数调用完成之后,复制生成的变量自动调用析构函数释放。如果不去掉&,则传入参数是一个引用,参数传递过程中就复制该引用
    (复制的引用是指向同一个变量的,在传递过程中并没有产生新的变量,所以不会调用构造函数)。你的疑问与友元函数没有多少关系,你可以了解一下函数调用过程。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 滑块验证码移动速度不一致问题
  • ¥15 定制ai直播实时换脸软件
  • ¥100 栈回溯相关,模块加载后KiExceptionDispatch无法正常回溯了
  • ¥15 Utunbu中vscode下cern root工作台中写的程序root的头文件无法包含
  • ¥15 麒麟V10桌面版SP1如何配置bonding
  • ¥15 Marscode IDE 如何预览新建的 HTML 文件
  • ¥15 K8S部署二进制集群过程中calico一直报错
  • ¥15 java python或者任何一种编程语言复刻一个网页
  • ¥20 如何通过代码传输视频到亚马逊平台
  • ¥15 php查询mysql数据库并显示至下拉列表中