Trang tài liệu
Khóa học C++ nền tảng
Chương 8. Cấu trúc và lớp
Quy Tắc Zero, Five, Three

Quy Tắc Zero, Five, Three

Quy tắc Zero, Three và Five trong C++

Quy tắc zero, three và five là một bộ hướng dẫn để quản lý tài nguyên đối tượng trong C++ hiện đại, liên quan đến cấu trúc và lớp. Các quy tắc này xử lý hành vi mặc định của hàm tạo, hàm hủy và các hàm thành viên đặc biệt khác cần thiết để quản lý tài nguyên phù hợp.

Quy luật Zero

Quy tắc Zero tuyên bố rằng nếu một lớp hoặc cấu trúc không quản lý tài nguyên một cách rõ ràng, thì nó không nên định nghĩa bất kỳ hàm thành viên đặc biệt nào, tức là hàm hủy, hàm tạo sao chép, toán tử gán sao chép, hàm tạo di chuyển và toán tử gán di chuyển. Trình biên dịch sẽ tự động tạo các hàm này và hành vi sẽ chính xác để quản lý các tài nguyên như bộ nhớ và xử lý file.

Ví dụ:

struct MyResource {
    std::string name;
    int value;
};

Trong ví dụ này, MyResource là một cấu trúc đơn giản không quản lý bất kỳ tài nguyên nào, vì vậy nó không xác định bất kỳ hàm thành viên đặc biệt nào. Trình biên dịch sẽ tự động tạo chúng và hành vi sẽ chính xác.

Quy tắc Three

Quy tắc Three quy định rằng một lớp hoặc cấu trúc quản lý tài nguyên nên xác định ba hàm thành viên đặc biệt sau:

  • hàm hủy
  • hàm tạo sao chép
  • Hàm sao chép toán tử gán

Các hàm này là cần thiết để quản lý tài nguyên phù hợp, chẳng hạn như giải phóng bộ nhớ hoặc xử lý chính xác các bản sao sâu.

Ví dụ:

class MyResource {
public:
    // Hàm tạo và hàm hủy
    MyResource() : data(new int[100]) {} 
    ~MyResource() { delete[] data; } 

    // Sao chép hàm tạo
    MyResource(const MyResource& other) : data(new int[100]) {
        std::copy(other.data, other.data + 100, data);
    }

    // Sao chép toán tử gán
    MyResource& operator=(const MyResource& other) {
        if (&other == this) { return *this; }
        std::copy(other.data, other.data + 100, data);
        return *this;
    }

private:
    int* data;
};

Trong ví dụ này, MyResource là một lớp quản lý tài nguyên (một mảng các số nguyên), do đó, nó định nghĩa hàm hủy, hàm tạo bản sao và toán tử gán bản sao.

Quy tắc Five

Quy tắc Five mở rộng Quy tắc Three để bao gồm thêm hai hàm thành viên đặc biệt:

  • Di chuyển hàm tạo
  • Di chuyển hàm toán tử gán

C++ hiện đại giới thiệu ngữ nghĩa di chuyển, cho phép xử lý tài nguyên hiệu quả hơn bằng cách chuyển quyền sở hữu mà không nhất thiết phải sao chép tất cả dữ liệu.

Ví dụ:

class MyResource {
public:
    // Hàm tạo và hàm hủy
    MyResource() : data(new int[100]) {}
    ~MyResource() { delete[] data; }

    // Sao chép hàm tạo
    MyResource(const MyResource& other) : data(new int[100]) {
        std::copy(other.data, other.data + 100, data);
    }

    // Sao chép toán tử gán
    MyResource& operator=(const MyResource& other) {
        if (&other == this) { return *this; }
        std::copy(other.data, other.data + 100, data);
        return *this;
    }

    // Di chuyển hàm tạo
    MyResource(MyResource&& other) noexcept : data(other.data) {
        other.data = nullptr;
    }

    // Di chuyển hàm toán tử gán
    MyResource& operator=(MyResource&& other) noexcept {
        if (&other == this) { return *this; }
        delete[] data;
        data = other.data;
        other.data = nullptr;
        return *this;
    }

private:
    int* data;
};

Trong ví dụ này, MyResource là một lớp quản lý tài nguyên (một mảng các số nguyên), do đó, nó xác định tất cả năm hàm thành viên đặc biệt để quản lý tài nguyên phù hợp và di chuyển ngữ nghĩa.