Quy tắc ba là quy tắc ngón tay cái khi sử dụng C ++. Đây là một loại quy tắc thực hành tốt nói rằng Nếu lớp của bạn cần bất kỳ
- một phương thức tạo bản sao,
- một toán tử gán,
- hoặc một trình hủy,
được xác định rõ ràng, thì có khả năng cần cả ba.
Tại sao thế này? Đó là bởi vì, nếu lớp của bạn yêu cầu bất kỳ điều nào ở trên, nó đang quản lý các tài nguyên được phân bổ động và có thể sẽ cần cái kia để đạt được điều đó thành công. Ví dụ:nếu bạn yêu cầu toán tử gán, bạn sẽ tạo bản sao của các đối tượng hiện đang được sao chép bằng tham chiếu, do đó phân bổ tài nguyên. Bạn sẽ cần hàm tạo bản sao để sao chép và trình hủy để giải phóng các tài nguyên này.
Quy tắc năm là một phần mở rộng của quy tắc ba do sự ra đời của ngữ nghĩa chuyển động trong C ++ 11. Quy tắc năm cũng được áp dụng trong C ++ để quản lý tài nguyên. Quy tắc này có khả năng loại bỏ rò rỉ bộ nhớ và các vấn đề khác trong mã C ++. Quy tắc của The Big Five nói rằng nếu bạn phải viết một trong các hàm sau thì bạn phải có một chính sách cho tất cả chúng. Nếu chúng ta có Object Foo thì chúng ta có thể có FooManager xử lý Foo tài nguyên. Khi triển khai FooManager, có thể bạn sẽ cần triển khai tất cả các chức năng sau -
-
hàm hủy - Khi trình quản lý này vượt ra khỏi phạm vi, nó sẽ giải phóng tất cả các tài nguyên mà nó đang quản lý.
-
toán tử gán - Nếu bạn không cung cấp một toán tử, trình biên dịch sẽ tạo một toán tử gán mặc định. Thao tác gán mặc định là một chức năng sao chép thông minh dành cho thành viên và thực hiện một bản sao nông chứ không phải một bản sao sâu. Điều này có thể gây ra các vấn đề như rò rỉ bộ nhớ, gán sai.
-
phương thức tạo bản sao - Phương thức tạo bản sao do trình biên dịch cung cấp thực hiện một bản sao thông minh thành viên của tất cả các thuộc tính FooManagers. Điều này đặt ra các vấn đề tương tự như toán tử gán.
-
move constructor - Việc sao chép các đối tượng có thể tốn kém vì nó liên quan đến việc tạo, sao chép và sau đó phá hủy các đối tượng tạm thời. C ++ 11 đã giới thiệu khái niệm tham chiếu giá trị r. Một tham chiếu giá trị r có thể được liên kết rõ ràng với một giá trị r. Giá trị r là một đối tượng không có tên. Nói cách khác là một đối tượng tạm thời. Tham chiếu giá trị r này có thể được sử dụng trong một hàm tạo để tạo tham chiếu đến giá trị r được truyền cho nó
-
move constructor - Việc sao chép các đối tượng có thể tốn kém vì nó liên quan đến việc tạo, sao chép và sau đó phá hủy các đối tượng tạm thời. C ++ 11 đã giới thiệu khái niệm tham chiếu giá trị r. Một tham chiếu giá trị r có thể được liên kết rõ ràng với một giá trị r. Giá trị r là một đối tượng không có tên. Nói cách khác là một đối tượng tạm thời. Tham chiếu giá trị r này có thể được sử dụng trong một phương thức khởi tạo để tạo tham chiếu đến giá trị r được truyền cho nó.
-
chuyển toán tử gán - Sẽ rất hữu ích khi chỉ có một tài nguyên tại một thời điểm. Quyền sở hữu tài nguyên này có thể được chuyển từ người quản lý này sang người quản lý khác. Trong những trường hợp như vậy, bạn có thể cung cấp toán tử chỉ định di chuyển.
Đây là một tài nguyên tuyệt vời để tìm hiểu về quy tắc năm - https://www.feabhas.com/sites/default/files/2016-06/Rule%20of%20the%20Big%20Five.pdf.