2016-10-17 2 views
0

Текущий get() Функция-член в классе MyClass определена ниже, тип возврата - const int&. Мой вопрос: что будет разница, если я определил get() функциюПример примера функции возврата в C++

int& get() const

или

int get() const

? И какой способ рекомендуется?

#include <iostream> 
using namespace std; 

class MyClass { 
    int x; 
    public: 
    MyClass(int val) : x(val) {} 
    const int& get() const {return x;} 
}; 

void print (const MyClass& arg) { 
    cout << arg.get() << '\n'; 
} 

int main() { 
    MyClass foo (10); 
    print(foo); 

    return 0; 
} 
+2

возвращение 'int' намного проще –

+1

Возвращение' int & 'означает, что вызывающий может сказать следующее:' myclass.get() = 42' – selbie

+0

@selbie Перед тем, как 'get()' не будет компилироваться, потому что он пытается связать 'const int' в' int & '. – songyuanyao

ответ

2

В этом коде нет ничего плохого; логически он выполняет более или менее то же самое после того, как компилятор заключает в себе метод get().

Там довольно большая разница в некоторых вырожденных звонящих хотя:

const int *iptr = &foo.get(); // returns the address of x in the class. 

С другой стороны, если бы вы объявлены следующим образом:

class MyClass { 
    int x; 
    public: 
    MyClass(int val) : x(val) {} 
    const int get() const {return x;} 
}; 

const int *iptr = &foo.get(); // Error! 

Я не вижу особых оснований для int& здесь , Если у вас его нет, люди будут хмуриться над этим кодом. Обычно, если люди должны держать указатели на вещи вокруг, вы не возвращаете их по ссылке. Единственная причина, по которой вы хотели бы вернуть указатель на член, - это то, что кто-то может автоматически изменять настройки; и я никогда не видел для этого хорошей пользы, хотя я могу себе представить, почему такая вещь может существовать.

Что касается комментария selbie о назначении ему; это ссылка const; присвоение ему является ошибкой времени компиляции.

+0

Только один вопрос, как насчет просто 'int get()'? Кажется, что в этом случае нельзя изменить x, либо (как и ссылка 'const'), правильно? Каково ваше мнение об этом? Заранее спасибо! – Nicholas

+0

@ Николас: Ты прав; int get() const - это то, что вы обычно используете. – Joshua