2014-10-05 49 views
2

我不明白我什么时候想要返回一个函数的引用(即T& func(){...})。什么时候你会返回一个函数的引用?

例如:

T& func() { 
    Something t; 
    return t; 
} 

这将创建一个名为t一个Something实例,然后通过引用返回。当我们超出范围时,t丢失。所以参考是指0我认为..?

换句话说,为什么我会想要返回一个引用或一个const引用?请解释并举例说明。

+2

对函数中定义的静态变量返回引用并不少见。成员函数也经常返回引用。每当引用是一个持续时间比该函数更长的对象时,如果这是有意义的。 – Galik 2014-10-05 23:42:33

+0

另一个例子是max。请仔细关注样本实施中的返回类型http://www.cplusplus.com/reference/algorithm/max/ – 2014-10-05 23:51:01

+0

参考文献如何神奇地开始参考“0”?那有什么意思? – 2014-10-06 00:04:00

回答

3

当您从某个函数的参数中返回成员时,通常会这样做。从标准库的一个例子:

template<class T, size_t n> 
struct array 
{ 
    T data[n]; 

    T& operator[](size_t i) { return data[i]; } 
}; 
1

有时你返回到一个函数中定义一个静态变量的引用:

T& func() { 
    static Something t; // this will exist until program closes 
    return t; 
} 

这是一种技术,以帮助包括静态初始化的顺序作战的问题。

显然成员变量是有意义的(我敢肯定,你不问那些虽然):

T& MyType::func() { 
    return this->t; // persists with the object 
} 

而且有时你想返回在传递给函数的对象:

std::ostream& operaor<<(std::ostream& os, const MyType& t) { 
    // blah blah 
    return os; // pass it back out 
} 

这可让您链功能结合在一起,如:

if(std::getline(input >> size >> std::ws, line)) 
{ 
    // size and line were successfully read here 
} 
0

你能想到的引用只是指针而已。每当你从函数返回一个指针时,你可能会返回一个引用类型。

我认为你的问题与返回引用是范围的问题。只要没有范围问题,它就是您可以使用的另一种工具。

0

返回对当前对象的引用用于实现用户定义的赋值运算符。

class Foo 
{ 
    Foo& operator=(const Foo&); 
    //... 
}; 

实现运营商+=-=*=等的过载时,它也可以用来作为返回类型,这些运营商表明,返回类型为调整后的当前对象,而不是一个新的对象。因此,要返回当前对象,请返回对*this的引用。

相关问题