누군가이 코드를 설명 할 수 있습니까? 3 호선을 이해할 수 없습니다.* this와 관련된 C++ 코드가 혼란 스럽습니까?
MyString MyString::operator+(const MyString &str)
{
MyString ss(*this); //----> explain this part
ss += str;
return ss;
}
고마워요!
누군가이 코드를 설명 할 수 있습니까? 3 호선을 이해할 수 없습니다.* this와 관련된 C++ 코드가 혼란 스럽습니까?
MyString MyString::operator+(const MyString &str)
{
MyString ss(*this); //----> explain this part
ss += str;
return ss;
}
고마워요!
이 코드 :
MyString ss(*this);
는 "ss
라는 이름의 형태 MyString
의 새 변수를 선언하고 *this
의 사본으로 초기화합니다."말한다 멤버 함수 내에서 this
은 리시버 개체 (멤버 함수가 작동하는 개체)에 대한 포인터이므로 *this
은 리시버 개체에 대한 참조입니다. 따라서 ss
이라고하는 새 MyString
을 만들고받는 사람 개체의 복사본으로 읽을 수 있습니다. "
여기에서 사용되는 관용구는 으로 표현하면 operator +
입니다. 이 아이디어는 receiver 객체의 사본을 만들고, operator +=
을 사용하여 매개 변수를 사본에 추가 한 다음 사본을 리턴하는 것입니다. 이것은 대응하는 복합 할당 연산자의 구현을 고려한 자립형 연산자의 구현을 단순화하는 널리 사용되는 트릭입니다.
희망이 도움이됩니다.
MyString
의 현재 오브젝트 (유형 MyString
)의 값을 인수로 취하는 MyString
의 생성자입니다.
내가 알 수있는 것은 현재 MyString 객체의 내용으로 새로운 MyString을 만드는 복사 생성자입니다.
ss
은 원래 문자열에서 복사 생성자 으로 생성되는 새로운 문자열입니다.
이것은 하나의 연산자를 다른 연산자로 구현하는 공통 코드 재사용 기술의 인스턴스입니다.
가정 해 우리가 이미 화합물 더하기 연산자 정의 :
class X
{
X & operator+=(const X&);
};
이 단항 연산자 우리가 a += b
를 작성할 수를, 그것은 a
을 수정하고 자신에 대한 참조를 반환합니다. 이것은 모두 좋고 좋다. 이제 값으로 새 값을 반환하는 복사, 바이너리 플러스 opearator a + b
을 제공하고 a
및 b
을 변경하지 않은 채로 복합 연산자에 대해 이미 작성한 코드를 활용하고 싶습니다. 우리는 a
의 임시 사본에 단항 연산자를 호출하여 그렇게 :
X X::operator+(const X & b) const { return X(*this) += b; }
^^^^^^^^
temporary copy
이 코드를 자세하게 단지 조금 더, 바로 이러한 것입니다. 당신도 쓸 수있다. return MyString(*this) += str;
const 액세스의 관점에서 비 const 액세스 구현, 복사 구성 및 스왑의 관점에서 복사 할당, 이동 할당과 같은 유사한 성향을 가진 다른 관용구가 있습니다 이동 구성과 스왑 측면에서 코드 복제를 피하는 것이 항상 중요합니다.
문제의 '연산자 +'는 독립형이 아니며 구성원 연산자입니다. 그렇지 않으면 'this'가 없습니다 .-) –
죄송합니다. "독립 선언"이란 의미는 "복합 할당 버전이 아닙니다."라는 의미입니다. 그것은 아마도 최고의 용어가 아니 었습니다. :-) – templatetypedef
@templatetypedef : "비 변형":) – GManNickG