다른 답변은 하나의 과부하 만있는 것을 제안합니다 operator =(String rhs)
가치로 논쟁을 취하지 만 이것은입니다 ~ 아니다 가장 효율적인 구현.
이 예에서 David Rodríguez -Dribeas가
String f();
String a;
a = f(); // with String& operator=(String)
사본이 없습니다. 그러나 그냥 가정하십시오 operator =(String rhs)
제공 되고이 예를 고려합니다.
String a("Hello"), b("World");
a = b;
무슨 일이 일어나는지
b
복사됩니다 rhs
(메모리 할당 + memcpy
);
a
그리고 rhs
교환됩니다.
rhs
파괴됩니다.
우리가 구현하는 경우 operator =(const String& rhs)
그리고 operator =(String&& rhs)
그런 다음 대상의 길이가 소스보다 큰 경우 1 단계에서 메모리 할당을 피할 수 있습니다. 예를 들어, 이것은 간단한 구현입니다 (완벽하지 않음 : 더 나을 수 있습니다. String
a capacity
회원):
String& operator=(const String& rhs) {
if (len < rhs.len) {
String tmp(rhs);
swap(tmp);
else {
len = rhs.len;
memcpy(data, rhs.data, len);
data[len] = 0;
}
return *this;
}
String& operator =(String&& rhs) {
swap(rhs);
}
성능 지점 외에도 swap
~이다 noexcept
, 그 다음에 operator =(String&&)
할 수 있습니다 noexcept
또한. (메모리 할당이 "잠재적으로"수행되는 경우에는 해당되지 않습니다.)
이 우수한 자세한 내용을 참조하십시오 설명 Howard Hinnant.