请告诉我使用级联,以及何时使用&像这样的函数之前int& func() 我应该在哪里使用,请给我一个小例子,谢谢。我认为它确实会返回一个地址但不知道如何使用。
答案 0 :(得分:1)
何时使用&
当您希望调用者能够更改原始变量时,通常会返回引用。示例可以返回数组的元素
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::istream
和std::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
的引用。