|
|
@ -16,14 +16,14 @@ class String { |
|
|
|
|
|
|
|
|
|
|
|
String(const String& other); |
|
|
|
String(const String& other); |
|
|
|
|
|
|
|
|
|
|
|
void swap(String& other) { |
|
|
|
friend void swap(String& first, String& second) { |
|
|
|
using std::swap; // for arguments-dependent lookup (ADL) |
|
|
|
using std::swap; // for arguments-dependent lookup (ADL) |
|
|
|
swap(size_, other.size_); |
|
|
|
swap(first.size_, second.size_); |
|
|
|
swap(buffer_, other.buffer_); |
|
|
|
swap(first.buffer_, second.buffer_); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
String& operator=(String other) { |
|
|
|
String& operator=(String other) { |
|
|
|
swap(other); |
|
|
|
swap(*this, other); |
|
|
|
return *this; |
|
|
|
return *this; |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
}; |
|
|
@ -34,4 +34,4 @@ Using the copy-swap idiom: |
|
|
|
- The left-hand side object's contents are swapped with the temporary copy. |
|
|
|
- The left-hand side object's contents are swapped with the temporary copy. |
|
|
|
- The temporary copy is destroyed, releasing any resources that were previously held by the left-hand side object. |
|
|
|
- The temporary copy is destroyed, releasing any resources that were previously held by the left-hand side object. |
|
|
|
|
|
|
|
|
|
|
|
This approach simplifies the implementation and provides strong exception safety, while reusing the copy constructor and destructor code. |
|
|
|
This approach simplifies the implementation and provides strong exception safety, while reusing the copy constructor and destructor code. |
|
|
|