返回参考和使用级联功能

时间:2014-03-09 13:33:47

标签: c++

请告诉我使用级联,以及何时使用&像这样的函数之前int& func() 我应该在哪里使用,请给我一个小例子,谢谢。我认为它确实会返回一个地址但不知道如何使用。

2 个答案:

答案 0 :(得分:1)

  

何时使用&


按值返回vs按引用返回

当您希望调用者能够更改原始变量时,通常会返回引用。示例可以返回数组的元素

struct Array
{
    int values[ 10];
};

// Returns a reference to the nIndex element of rArray
int& Value( Array &rArray, int nIndex)
{
    return Array.values[ nIndex];
}

int main()
{
    Array myArray;
    // Set the 10th element of sMyArray to the value 5
    Value( myArray, 10) = 5;

    assert( myArray.values[ 10] == 5);  // OK
    return 0;
}

另一个例子是返回对类成员的引用。您想要返回原始变量,而不是它的副本。考虑:

struct A {
  int something;
  int f() { return something; }
  int& g() { return something; }
};

int main()
{
    A myA;
    int i = myA.f();  // return by value: not original 
                      // int but its copy with same value
    i = 200;  

    assert( myA.something == 200);  // fail
    return 0;
}

但:

int main()
{
    A myA;
    int& i = myA.g();  // return by reference: original 
                       // variable is referenced by i now
    i = 200;  

    assert( myA.something == 200);  // OK
    return 0;
}

运营商链接

运算符链接允许使用以下表达式:

a = b + c + d;

std::cout << "this" << " and " << "this";

通常可以选择通过考虑运算符的含义或通过引用而返回值,例如std::istreamstd::ostream不可复制,因此尝试返回这些类型的值是一个错误。

答案 1 :(得分:1)

您将在C ++中提交一个非常常见的新手错误,即返回对死对象的引用。

int &GetNumber()
{
    int number = 123;
    return number;
}

int main()
{
    int x = GetNumber();
    int y = x + 1;
}

看起来很无辜但会产生所谓的未定义行为。这意味着程序可以做任何想做的事情 - 它可能会崩溃,或者有时会崩溃。无论如何,它都不安全。如果您尝试这样做,您的编译器甚至可能会警告您。原因是,当GetNumber完成时,本地number被销毁,最终你得到了对被破坏对象的引用。

通常,您需要返回副本而不是引用。这是在C ++中做的“正常”事情:

int GetNumber() // now OK
{
    int number = 123;
    return number;
}

int main()
{
    int x = GetNumber();
    int y = x + 1;
}

当您知道在函数返回后所引用的对象将继续存在时,返回引用才是安全的。一个例子是当你刚刚返回一个你被传递的引用时:

int &MyFunction(int &number)
{
    // do something
    return number;
}

这允许你链接函数:

struct Example
{
    Example &MyFunction(Example &example)
    {
        // do something
        return example;
    }
};

int main()
{
    Example example;
    example.MyFunction(example).MyFunction(example).MyFunction(example);
}

现在,如果这个示例让您感到特别无用(应该如此),请查看标准库如何使用<<处理std::ostream调用以获得真实用例。

std::cout << 1 << "a" << 0.5;

此语法有效,因为每个operator<<调用都会返回对std::cout的引用。