我有几个关于参考变量的问题

I have a few questions about reference variable

本文关键字:变量 问题 参考 有几个 于参考      更新时间:2023-10-16
typedef struct
{
int xpos = 0;
int ypos = 0;
}Point;
Point& PA(const Point &p1, const Point &p2)
{
Point *pptr = new Point;
pptr->xpos = p1.xpos + p2.xpos;
pptr->ypos = p1.ypos + p2.ypos;
return *pptr;
}
int main()
{
Point *pptr1 = new Point;
pptr1->xpos = 3;
pptr1->ypos = 20;
Point *pptr2 = new Point;
pptr2->xpos = 70;
pptr2->ypos = 7;
Point &ref = PA(*pptr1, *pptr2);
delete pptr1;
delete pptr2;
delete &ref;
return 0;
}
  1. 首先,我有一个问题,关于如何声明一个变量以将局部变量返回为引用类型。函数PA的返回类型是Point&正如你所看到的。然而,在函数的定义内部,它返回一个用动态分配声明的结构变量。这怎么可能

注意:不要在C++中使用typedef struct,这是C习语,在C++中只会造成伤害。只需定义它,并可能添加一些因素:

struct Point
{
int xpos = 0;
int ypos = 0;
Point() = default;
Point( int x, int y ) : xpos( x ), ypos( y ) {}
};

首先,我有一个关于如何声明一个变量以将局部变量返回为引用类型的问题。

不能返回对局部变量的引用,因为这会导致悬空引用。尽管可以使用静态变量使其"工作",但这不是一个好的解决方案,您最好将此函数更改为按值返回。

然而,在函数的定义中,它返回一个用动态分配声明的结构变量。这怎么可能?

您通过取消引用来返回对动态分配对象的引用,这最终导致了删除引用地址的丑陋破解。你永远不应该那样做。如果函数假设返回动态分配的对象,请使用智能指针来清楚地显示您的意图。在这种情况下,这是不必要的,您应该只返回值对象:

Point PA(const Point &p1, const Point &p2)
{
Point p;
p.xpos = p1.xpos + p2.xpos;
p.ypos = p1.ypos + p2.ypos;
return p;
}

或者,如果你如上所述添加了actor,它的缩写为:

Point PA(const Point &p1, const Point &p2)
{
return Point( p1.xpos + p2.xpos, p1.ypos + p2.ypos );
}

并且main也变得更短:

int main()
{
Point p1( 3, 20 );
Point p2( 70, 7 );
Point r = PA(p1, p2);
std::cout << r.posx << "," << r.posy << std::endl;
return 0;
}

函数PA()不返回任何对象,而是对一个对象(Point(的引用,该对象已初始化为引用地址为pptr的对象。

引用就像指针一样,但可以像使用实物一样使用(=对象(。与指针不同,引用不能被分配(为了引用另一个对象(,而是在其整个生命周期中绑定到同一个对象(分配给引用意味着分配给被引用的对象(。这意味着引用必须初始化,但也意味着引用可能是悬空的(例如,在代码中,refdelete &ref;之后悬空(。