2016-10-17 2 views
0

현재 get() 클래스의 멤버 함수는 다음과 같이 정의됩니다. 반환 유형은 const int&입니다. 내 질문은 내가C++에서 반환 함수 유형 예제

int& get() const

또는

int get() const

으로 get() 기능을 정의하는 경우의 차이가 될 것입니다 무엇입니까? 그리고 어떤 방법으로 추천할까요?

#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() 메소드를 인라인 한 후에도 거의 같은 결과를 얻는다.

하지만 일부 타락한 발신자에 꽤 큰 차이가있다 :

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

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

여기 int&에 대한 좋은 이유가 표시되지 않습니다 : 다음과 같이 선언했다 반면에

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

가 . 가지고 있지 않다면이 코드를 싫어할 것입니다. 일반적으로 사람들이 주위 물건에 대한 포인터를 계속 유지해야하는 경우 참조로 반환하지 마십시오. 멤버에 대한 포인터를 반환하려는 유일한 이유는 누군가가 자동으로 변경 사항을 픽업 할 수 있기 때문입니다. 나는 그러한 것들이 왜 존재할 수 있는지 상상할 수는 있지만, 결코 그런 용도로 사용하지 못했습니다.

할당에 대한 selbie의 의견은 다음과 같습니다. 그것은 const 참조입니다; 그것에 할당하는 것은 컴파일 타임 오류입니다.

+0

단지 하나의 후속 질문입니다, 간단히'int get()'에 대해서? 이 경우에는 x를 변경할 수 없다 (단지'const' 참조와 같다), 맞습니까? 이것에 대한 당신의 의견은 어떻습니까? 미리 감사드립니다! – Nicholas

+0

@ 니콜라스 : 당신이 맞습니다; int get() const 일반적으로 사용하는 것입니다. – Joshua