2011-08-10 3 views

답변

11

이 코드 :

MyString ss(*this); 

는 "ss라는 이름의 형태 MyString의 새 변수를 선언하고 *this의 사본으로 초기화합니다."말한다 멤버 함수 내에서 this은 리시버 개체 (멤버 함수가 작동하는 개체)에 대한 포인터이므로 *this은 리시버 개체에 대한 참조입니다. 따라서 ss이라고하는 새 MyString을 만들고받는 사람 개체의 복사본으로 읽을 수 있습니다. "

여기에서 사용되는 관용구는 으로 표현하면 operator +입니다. 이 아이디어는 receiver 객체의 사본을 만들고, operator +=을 사용하여 매개 변수를 사본에 추가 한 다음 사본을 리턴하는 것입니다. 이것은 대응하는 복합 할당 연산자의 구현을 고려한 자립형 연산자의 구현을 단순화하는 널리 사용되는 트릭입니다.

희망이 도움이됩니다.

+0

문제의 '연산자 +'는 독립형이 아니며 구성원 연산자입니다. 그렇지 않으면 'this'가 없습니다 .-) –

+0

죄송합니다. "독립 선언"이란 의미는 "복합 할당 버전이 아닙니다."라는 의미입니다. 그것은 아마도 최고의 용어가 아니 었습니다. :-) – templatetypedef

+0

@templatetypedef : "비 변형":) – GManNickG

1

MyString의 현재 오브젝트 (유형 MyString)의 값을 인수로 취하는 MyString의 생성자입니다.

1

내가 알 수있는 것은 현재 MyString 객체의 내용으로 새로운 MyString을 만드는 복사 생성자입니다.

1

ss은 원래 문자열에서 복사 생성자 으로 생성되는 새로운 문자열입니다.

3

이것은 하나의 연산자를 다른 연산자로 구현하는 공통 코드 재사용 기술의 인스턴스입니다.

가정 해 우리가 이미 화합물 더하기 연산자 정의 :

class X 
{ 
    X & operator+=(const X&); 
}; 

이 단항 연산자 우리가 a += b를 작성할 수를, 그것은 a을 수정하고 자신에 대한 참조를 반환합니다. 이것은 모두 좋고 좋다. 이제 값으로 새 값을 반환하는 복사, 바이너리 플러스 opearator a + b을 제공하고 ab을 변경하지 않은 채로 복합 연산자에 대해 이미 작성한 코드를 활용하고 싶습니다. 우리는 a임시 사본에 단항 연산자를 호출하여 그렇게 :

X X::operator+(const X & b) const { return X(*this) += b; } 
              ^^^^^^^^ 
              temporary copy 

이 코드를 자세하게 단지 조금 더, 바로 이러한 것입니다. 당신도 쓸 수있다. return MyString(*this) += str;

const 액세스의 관점에서 비 const 액세스 구현, 복사 구성 및 스왑의 관점에서 복사 할당, 이동 할당과 같은 유사한 성향을 가진 다른 관용구가 있습니다 이동 구성과 스왑 측면에서 코드 복제를 피하는 것이 항상 중요합니다.