2013-04-29 5 views
0

친구 기능 및 사용과 관련된 정보를 검토했습니다. 그들은 OOP의 황금률 중 하나를 위반하지 않으면 서 클래스 내의 캡슐화 된 데이터에 액세스 할 수 있습니다. I/O 연산자를 오버로딩하기위한 다양한 소스 코드를 제공하면서 (C++ 학습에서 처음 배운 기본 연산 중 하나 인) 모든 연산자는 클래스 외부에서 연산자를 친구로 정의합니다. 내 질문 :이 해야합니까? 왜 함수를 클래스의 public 멤버로 선언하고 캡슐화 된 모든 것을 유지하면서 클래스의 데이터를 삽입/표시해야합니까? 다른 연산자에 과부하가 걸리지 않는 것 같지만 I/O 연산자에 과부하가 걸린다고 가정합니다.친구 기능 및 I/O 운영자와의 관계

감사합니다.

+0

[멤버 함수 또는 비 멤버 (친구) 함수로 오버로드 연산자가 가능한가?] (http://stackoverflow.com/questions/1905439/overload-operators-as-member-function-or-non -member-friend-function) –

답변

2

의 당신이 당신의 클래스 X에 대한 operator<<에 과부하가하고 싶은 말은하자, 그래서 당신은 다음과 같이 사용할 수 있습니다 : std::cout이 연산자의 첫 번째 피연산자입니다

X x; 
std::cout << x; 

공지있다. 이것을 구성원 함수로 구현하려면, std::cout 유형 인 std::basic_ostream의 구성원이어야합니다. 이미 정의 된 클래스에 멤버를 추가 할 수 없습니다. 그것이 우리가 대신에 자유 함수로 선언 한 이유입니다.

X x; 
x << something; 

이 취급 할 때 당신이 원하는 것을 분명히되지 않습니다 :

당신은이처럼 사용하는 것이 그래서, 그 첫 번째 피연산자로 X 객체를 복용 할 것, X의 구성원으로 operator<<를 오버로드 된 경우 I/O.

0

회원 함수로 a @ b과 같은 오버로드 된 연산자가있는 경우 해당 호출은 [email protected](b);으로 변환됩니다. 즉, 함수는 왼쪽에 피연산자 유형의 클래스 멤버 여야합니다. iostream의 경우 iostream 자체의 구성원이어야하는 모든 운영자가됩니다. IOSTREAMS가 회원으로 일부 삽입/추출 연산자를 제공 할 수 있지만

, 당신은 일반적으로이 iostream 클래스 자체 1를 수정하지 않고 더 추가 할 수 있어야합니다. 이를 위해서는 멤버 함수 대신에 자유 함수로 연산자를 구현해야합니다. 일반적으로 읽기/쓰기 (삽입/추출, 원하는 경우)하는 유형의 개인 부분에 액세스 할 수 있기를 원하므로 일반적으로 해당 클래스의 친구 여야합니다. 클래스는 확장에 열려 있어야하지만, 수정 폐쇄 :


  1. 소위 폐쇄/개방 원칙의 예입니다. 바꾸어 말하면, 그것을 수정하지 않고 확장하려고합니다.