2014-01-18 3 views
1

Какой тип возврата имеет следующий прототип функции?Что означает T const и означает в обратном виде функции?

int const& myfunctionname(int i) 

Я не получаю использование сопзЬ и & здесь. Если я возвращаю объекты/массивы/в основном нелокальные переменные, должен ли я использовать указатель или ссылку, если я хочу вернуть местоположение объекта?

+0

такой же как: const int & ... – neagoegab

+0

Эта функция возвращает ссылку на переменную-член класса, к которой она принадлежит, но вызывающая функция не сможет ее изменить. –

+0

@barakmanos: Итак, сама переменная-член может быть изменена внутри функции, но любая вызывающая функция не может ее изменить? Кроме того, можете ли вы сказать мне, есть ли какие-либо предпочтения в использовании * или & для этого? – Floose

ответ

1

Такая функция может возвращать ссылку на переменную-член класса, к которой она принадлежит, но вызывающая функция не сможет ее изменить. Например:

class Foo 
{ 
public: 
    Foo() {boo=5;} 
public: 
    int const& myfunctionname(int i) {boo += i; return boo;} 
private: 
    int boo; 
} 

void func(Foo& foo) 
{ 
    const int& a = foo.myfunctionname(6); 
    a += 7; // Compilation error 
    int b = a+7; // OK 
} 

Дополнительные:

Наиболее распространенный пример возвращения постоянного значения в качестве ссылки, вероятно operator++().

2

Это означает, что вы возвращаете ссылку на значение, которое нельзя изменить.

Если вы возвращаете ссылку на локальную переменную, то вы будете иметь проблемы, так как он будет ссылаться на то, что больше не существует:

int const &GetValue() 
{ 
int x = 10; 
return x; // THIS IS BAD! 
} 

Кроме того, это действительно не имеет смысла return const ссылается на интегральные типы (int, long и т. д.), поскольку они в основном занимают то же место, что и ссылка. Однако, если вы это сделаете, это не имеет большого значения.

Если вы возвращаете нелокальные данные (т. Е. Данные членов), используйте ссылки, если данные всегда существуют, и используйте указатели, если данные могут не существовать, так что NULL указывает на отсутствие данных. Например:

const std::string &User()const 
{ 
    return m_Username; 
} 

int Age() const 
{ 
    return m_Age; // Pointless to use a reference here 
} 

const Person *Partner()const 
{ 
    return m_Parter; // User may not have a partner, so pointer 
} 

Сделать указатель или ссылку const, если вы не хотите, чтобы абонент, чтобы иметь возможность изменить возвращаемый объект.

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