gpt4 book ai didi

c++ - C++ 中的引用变量

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:14:53 31 4
gpt4 key购买 nike

假设我有以下 GPoint 代码片段,它有一个复制构造函数、赋值运算符和析构函数。 GCircle 也是如此,它有一个名为 GetCentre() 的函数,它返回 Gpoint 对象的拷贝(Centre).

mainButtonClick() 中,调用 GPoint &Centre = circle.GetCentre() 是否安全/有效?通过这样做(如果有效),我们将节省调用赋值运算符的时间!

class GPoint
{
public:

GPoint();
virtual ~GPoint();
GPoint(double p_dX, double p_dY);
GPoint (const GPoint &Source);
GPoint& operator = (const GPoint &point);

public:
double c_y;
double c_x;


};

class GCircle//:public GShape
{

public:
GCircle();
GCircle(GPoint p_point, double p_dRadius);
~GCircle(){}


operator GPoint&();
operator double&();

double& GetRadius() const ;
GPoint GetCentre() const {return c_Centre;} //Return copy Not a reference

public:
double c_dRadius;
GPoint c_Centre;
};


Dlg::ButtonClick()
{
GPoint Point1(10,2);
GCircle circle(Point1, 100);//100 is the radius.

**GPoint &Centre = circle.GetCentre();** //is this reference safe/valid or invalid

}

最佳答案

该代码不是有效的 C++(即使 VS 接受它),因为您不能将非常量引用绑定(bind)到右值(函数返回的临时值)。

至于特定的性能问题,考虑到您绑定(bind)的是 const 引用,根本没有优势。编译器将在调用函数中创建一个未命名的变量,然后将引用绑定(bind)到该变量,因此无论如何都会执行复制。

要澄清一点无论如何都会执行复制,是否执行复制取决于编译器是否可以忽略它,通常它可以。我知道的所有编译器都通过在调用者堆栈中分配对象并将指向该未初始化内存的指针传递给函数来实现对象的调用约定(对于寄存器来说太大)。该函数反过来使用该内存创建返回的对象,避免从返回的对象复制到GPoint p = circle.GetCentre(); 中的变量; ,执行从 circle.c_Centrep 的单个复制(如果将引用绑定(bind)到常量,则复制​​到未命名变量)。

关于c++ - C++ 中的引用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8407164/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com