Không có giá trị gia tăng nào cho static
chức năng thành viên, như bạn đã xác định chính xác. Tồi tệ hơn, khi được sử dụng để thực hiện chi tiết, điều này giới thiệu thêm phụ thuộc (trong thời gian biên dịch).
Chỉ sử dụng không thể mô phỏng bằng chức năng miễn phí ẩn danh, là quyền truy cập protected
, tức là lớp dẫn xuất truy cập chức năng tĩnh gốc. Tuy nhiên, điều này là không bao giờ cần thiết: bạn chỉ có thể làm cho nó một chức năng thành viên thường xuyên thay vào đó (tôi giả sử bạn không có nhà nước toàn cầu, nếu không sự phân biệt tĩnh/người bạn không phải là mối quan tâm ngay lập tức).
Việc sử dụng các chức năng static
trong lập trình meta mẫu đã được gợi lên ... tuy nhiên nó rất giống với vấn đề loại bên trong: nó gây khó khăn cho việc cung cấp phiên bản mặc định. Mặt khác, một chức năng miễn phí được xác định phù hợp (trong đó có các loại như một con trỏ), có thể đề xuất một mẫu phiên bản:
struct some_traits
{
static void doStuff();
};
// versus
struct some_traits {};
void doStuff(some_traits*);
// and the default: void doStuff(...);
Và tất nhiên, luôn là câu hỏi về lý do tại sao điều này sẽ là một hàm tĩnh , khi một chức năng thành viên sẽ cung cấp sự linh hoạt hơn cho người dùng. Để có hiệu ứng này, tôi sẽ trích dẫn việc di chuyển Ủy ban tiêu chuẩn được thực hiện với khái niệm Allocator
: các nhà phân bổ trạng thái hiện được ủy quyền, cho chúng ta cơ hội đóng gói các nút của một trang map
nhất định trong cùng một trang thay vì trải rộng trên tất cả các vùng.
Cuối cùng, có sự cố giao diện. Tuy nhiên nó đã được một thời gian dài kể từ khi Sutter ủng hộ rằng một lớp và các chức năng miễn phí được định nghĩa trong cùng một tiêu đề cả hai cấu thành giao diện công cộng của lớp này => đó là những gì ADL là dành cho! Vì vậy, nó là một cái gì đó để an ủi OO-lập trình viên cũ hơn là một "thực hành tốt".
Thực sự, tôi không thấy bất kỳ lợi ích nào khi sử dụng các hàm thành viên static
. Tôi muốn mọi người sẽ nghĩ ngược lại để đề xuất những trường hợp thực sự.
Nguồn
2011-01-18 16:16:41
Thường thì, thẳng thắn, bạn không nên. –