关于C ++中的返回const引用

时间:2012-03-13 13:57:34

标签: c++

我对在C ++中返回const引用感到困惑。所以我在下面编写代码块并在gnu c ++和visual studio上进行测试。并找到不同的答案。任何人都可以使用C ++中的返回const引用来说明好处,并且原因会导致不同编译器的行为不同。

#include <iostream>
using namespace std;

class A
{
public:
    A(int num1, int num2):m_num1(num1), m_num2(num2)
    {
            cout<<"A::A"<<endl;
    }
    const A& operator * (const A & rhs) const
    {
            return A(this->m_num1 * rhs.m_num1, this->m_num2*rhs.m_num1);
    }

    A(const A& rhs)
{
            this->m_num1 = rhs.m_num1;
            this->m_num2 = rhs.m_num2;
            cout<<"A::A(A&)"<<endl;
    }
    const A& operator = (const A& rhs)
    {
            cout<<"A::Operator="<<endl;
            return *this;
    }
    void Display();
private:
    int m_num1;
    int m_num2;
};

void A::Display()
{
    cout<<"num1:"<<m_num1<<" num2:"<<m_num2<<endl;
}

int main()
{
    A a1(2,3), a2(3,4);
    A a3 = a1 * a2;
    a3.Display();
    return 0;
}

在Gnu C ++上,它确实报告了正确的答案。但是在视觉研究编译器上失败了。

3 个答案:

答案 0 :(得分:8)

这将返回对局部变量的引用,这是不允许的:

const A& operator * (const A & rhs) const
{
    return A(this->m_num1 * rhs.m_num1, this->m_num2*rhs.m_num1);
}

您有悬挂引用和未定义的行为。

相关

答案 1 :(得分:1)

 const A& operator * (const A & rhs) const
 {
     return A(this->m_num1 * rhs.m_num1, this->m_num2*rhs.m_num1);
 }

这里很糟糕。

你正在返回一个悬空参考,如果它有效,那就是巧合。

您正在返回已被销毁的堆栈框架中存在的内容。 只需按值返回即可修复它。

答案 2 :(得分:1)

const A& operator * (const A & rhs) const
{
    return A(this->m_num1 * rhs.m_num1, this->m_num2*rhs.m_num1);
}

此函数返回对局部变量的引用。从此函数operator*返回时,局部变量将被销毁。所以这很危险。 您可以返回A,但不能返回A&。返回A时,函数会复制临时A以便返回。