Trang tài liệu
Khóa học C++ nền tảng
Chương 13. Idiom trong C++
Copy và Swap

Copy và Swap

Copy-swap là một đặc ngữ C++ tận dụng hàm tạo sao chép và hàm hoán đổi để tạo toán tử gán. Nó tuân theo một mô hình đơn giản nhưng mạnh mẽ: tạo một bản sao tạm thời của đối tượng bên phải và hoán đổi nội dung của nó với đối tượng bên trái.

Dưới đây là một bản tóm tắt ngắn gọn:

  • Copy: Tạo một bản sao cục bộ của đối tượng bên tay phải. Bước này tận dụng hàm tạo sao chép, cung cấp sự an toàn ngoại lệ và tái sử dụng mã code.
  • Swap: Hoán đổi nội dung của đối tượng bên trái với bản sao tạm thời. Bước này thường liên quan đến việc hoán đổi các con trỏ hoặc tài nguyên bên trong mà không cần sao chép lại toàn bộ nội dung.
  • Destruction: Phá hủy bản sao tạm thời. Điều này xảy ra khi thoát khỏi toán tử gán. Đây là một ví dụ mã code cho một lớp String đơn giản:
class String {
    // ... phần còn lại của lớp ...
 
    String(const String& other);
    
    void swap(String& other) {
        using std::swap; // để tra cứu phụ thuộc vào đối số (ADL)
        swap(size_, other.size_);
        swap(buffer_, other.buffer_);
    }
 
    String& operator=(String other) {
        swap(other);
        return *this;
    }
};

Sử dụng đặc ngữ copy-swap:

  • Đối tượng bên phải được sao chép khi được truyền giá trị cho toán tử gán.
  • Nội dung của đối tượng bên trái được hoán đổi với bản sao tạm thời.
  • Bản sao tạm thời bị hủy, giải phóng mọi tài nguyên mà đối tượng bên trái nắm giữ trước đó. Cách tiếp cận này đơn giản hóa việc triển khai và cung cấp sự an toàn ngoại lệ mạnh mẽ, đồng thời sử dụng lại mã code hàm tạo bản sao và mã code hàm hủy.