2013-10-03 3 views
0

Может ли один объяснить мне разницу между этими двумя функциями:C++ и возвращает ссылку

int& test(int a) 
{ 
    return a; 
} 

и

int test(int a) 
{ 
    return a; 
} 

и скажите мне, что цель, когда мы используем «&» оператор после возвращаемый тип функции? Когда мы должны использовать его, потому что я редко видел его раньше.

+0

Обычно вы не хотите использовать его в качестве типа возврата для точной причины, отображаемой здесь. – chris

+2

http://stackoverflow.com/a/2273821/78845 – Johnsyweb

+3

Это не «оператор». Это просто символ '&', который является тем же символом, который используется в некоторых операторах. – AnT

ответ

2

Может ли кто-нибудь объяснить мне разницу между этими двумя функциями?

Первый пример может привести к неопределенному поведению, поскольку возвращаемая ссылка «указывает» на переменную, которая в конце функции уничтожается. Это очень похоже (почти идентично) определению dangling pointer.

Второй случай - это нормальный «правильный» способ возврата переменной в указанном выше примере.


и скажите мне, что цель, когда мы используем «&» оператор после возвращения типа функции?

Назначение & после того, как тип в операторе return возвращает ссылку на этот тип.


Когда мы должны использовать его, потому что я редко видел его раньше.

Как правило, передача ссылки или возврат ссылки полезна, чтобы избежать копирования или возврата параметра, который может быть дорогостоящим.

С C++ 11 есть лучший способ обработки возвращающихся больших объектов: move semantics.

В других случаях он используется для обеспечения доступа к внутренним членам класса. Это пример std::string::operator[], например:

char& operator[] (size_t pos); 
const char& operator[] (size_t pos) const; 

Он также может быть использован, чтобы цепи вызова функции. Это относится к:

std::cout << 'H' << 'e' << 'l' << 'l' << 'o'; 

например. В приведенном выше коде std::ostream::operator<< возвращает ссылку на себя.

+0

Я не знаю точно, как объяснить, что это должно быть, потому что я плохо разбираюсь в английском, , но мне интересно, что означает «цель «когда мы используем & после типа возврата. может быть примером ниже, не показывает точно, что именно то, что я думаю, извините abo это. Я просто хочу знать «цель», когда мы ее используем. благодарит за комментарии: D – dinhha471

+0

@ dinhha471, Взгляните на новое редактирование. – Shoe

+0

На мой взгляд, хотя возвращение ссылки на int может быть законным «C», как указано выше, функция возвращает ссылку на переменную в стеке функций. Поэтому, когда вы пытаетесь получить к нему доступ, вы можете получить нарушение доступа или SEGV. – cowboydan

0

'&' оператор после типа возврата означает, что функция возвращает ссылку. Он имеет смысл использовать методы getter, такие как

class A{ 
public: 
    int &val(){return _val;} 
private: 
    int _val; 
}; 

Преимущество в том, что вы можете читать и изменять состояние объекта.Например:

A a; 
a.val() = 10; 

Но в вашем случае это, вероятно, лучше, чтобы передать ссылку на функцию, а затем вернуть его:

void test(int &a) 
{ 
    //do something with a 
} 

Это не хорошо, чтобы вернуть ссылку на функцию локального объект, например:

int& test() 
{ 
    int x;  
    return x; 
} 

, потому что x не существует функции вне Test().

+0

спасибо за упоминание геттера и сеттера, это просто понимать – dinhha471

0

Первый опасен из-за переменного объема. Если вы хотите сделать это таким образом, вы должны сделать переменную static.

Смежные вопросы