【问题标题】:what is the differences between returning reference or not in operator overloading C++在运算符重载C++中返回引用与不返回有什么区别
【发布时间】:2013-05-06 19:01:06
【问题描述】:

我试图弄清楚 & 在返回类型上的目的是什么。我的意思是,考虑下面的代码,如果我从运算符重载函数中删除 & 会发生什么。

    class Container
{


    public:
        int numElems;
        int *data;


    Container(int n):numElems(n){data=new int [numElems];}
    Container & operator=(const Container &rhs)
    {
        if(this!=&rhs)
        {
            if(data!=NULL)
                delete  [] data;
        numElems=rhs.numElems;
        data=new int [numElems];
        for (int i=0;i<numElems;i++)
        {   
            data[i]=rhs.data[i];    
        }
            return *this;
        }
    }

};

我删除它并编译它,它编译没有任何错误。实际上它在两种情况下给出了相同的结果,例如 main:

int main()
{
Container a(3);
Container b(5);
Container c(1);
cout<<a.numElems<<endl;
cout<<b.numElems<<endl;
cout<<c.numElems<<endl;
a=b=c;
cout<<a.numElems<<endl;
cout<<b.numElems<<endl;
cout<<c.numElems<<endl;
return 0;
}

那么,有没有人可以帮助我了解左侧 & 的用途?提前致谢。

【问题讨论】:

  • &amp;= 运算符重载中奇怪而肮脏的数组操作无关。 &amp; 只需要通过引用返回*this,即不复制它。

标签: c++ reference operator-overloading


【解决方案1】:
class foo {

    public:

        int val;

        foo() { }
        foo(int val) : val(val) { }

        foo& operator=(const foo &rhs) {
            val = rhs.val;
            return *this;
        }

        foo& operator++() {
            val++;
            return *this;
        }

};


void main() {
    foo f1(10), f2;
    (f2 = f1)++;
    std::cout << f1.val << " " << f2.val << std::endl;
}

输出:

10 11

移除引用时的输出:

10 10

【讨论】:

    【解决方案2】:

    返回一个引用比返回一个大对象的值要快得多。这是因为在底层,引用只是一个内存地址,而如果按值返回它,则需要深拷贝

    【讨论】:

    • 那么没有其他区别了吗?对于在返回类型中使用 & 的所有情况,我可以删除它们,唯一的机会是代码效率? @aaronman
    • 如果你接受一个引用并返回相同的引用,它将是同一个对象
    【解决方案3】:

    如果你不返回一个引用,你就隐含地做了一个额外的不必要的副本。

    【讨论】:

      猜你喜欢
      • 2020-07-09
      • 1970-01-01
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-08
      • 2021-03-04
      相关资源
      最近更新 更多