我有一些关于参考变量的问题

时间:2018-07-19 19:55:43

标签: c++ reference

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&。但是,在函数的定义内部,它返回通过动态分配声明的结构变量。这怎么可能?

2 个答案:

答案 0 :(得分:0)

注意:在C ++中不要使用typedef struct,它是C惯用语,在C ++中除了有害之外什么也没有。只需定义它并可能添加一些ctor:

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;
}

或者如果您如上所述添加了ctor,则其缩写为:

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;
}

答案 1 :(得分:-2)

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

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