Sự khác nhau giữa một lớp mẫu và một mẫu lớp là gì?Sự khác biệt giữa một lớp mẫu và một mẫu lớp là gì?
Trả lời
Đây là điểm chung của sự nhầm lẫn đối với nhiều người (bao gồm trang Lập trình chung trên Wikipedia, một số hướng dẫn C++ và các câu trả lời khác trên trang này). Theo như C++ là có liên quan, không có điều như là một "lớp mẫu", chỉ có một "mẫu lớp". Cách đọc cụm từ đó là "mẫu cho một lớp", trái với "mẫu hàm", là "mẫu cho hàm". Một lần nữa: các lớp không xác định các mẫu, các khuôn mẫu xác định các lớp (và các hàm). Ví dụ, đây là một mẫu, đặc biệt là một lớp mẫu, nhưng nó là không một lớp:
template<typename T> class MyClassTemplate
{
...
};
Việc kê khai MyClassTemplate<int>
được một lớp học, hay vẻ thông thái, một lớp học dựa trên mẫu. Không có thuộc tính đặc biệt nào của lớp dựa trên mẫu so với lớp không dựa trên mẫu. Các thuộc tính đặc biệt là của chính mẫu.
Cụm từ "lớp mẫu" nghĩa là không có gì, bởi vì từ "mẫu" không có nghĩa là tính từ khi được áp dụng cho danh từ "lớp" theo C++. Nó ngụ ý sự tồn tại của một lớp rằng là (hoặc xác định) một mẫu , không phải là một khái niệm tồn tại trong C++.
Tôi hiểu sự nhầm lẫn phổ biến, vì có thể dựa trên thực tế là các từ xuất hiện theo thứ tự "lớp mẫu" trong ngôn ngữ thực tế, đó là toàn bộ câu chuyện khác.
Lớp mẫu có liên quan đến Template Method design pattern, trong khi mẫu lớp chỉ là mẫu lớp "điền vào chỗ trống".
+1 cho câu trả lời ngắn gọn về các thuật ngữ của giáo dân. –
Sự khác biệt là thuật ngữ "lớp mẫu" không đơn giản không tồn tại trong tiêu chuẩn C++. Đó là một thuật ngữ được sử dụng chủ yếu bởi những người nghĩ rằng thuật ngữ "mẫu lớp" là khó hiểu (như các công ty Qt của Nokia và trước đây là Trolltech).
Tiêu chuẩn không có khái niệm về nó, do đó, tùy thuộc vào những người khác để tạo sự khác biệt. Một số người sử dụng nó một cách đồng nghĩa, và những người khác nói rằng thuật ngữ "lớp mẫu" đề cập đến một mẫu lớp được phân biệt rõ ràng hoặc rõ ràng, điều này sẽ làm cho nó tương đương với thuật ngữ "chuyên môn mẫu lớp". Về mặt lịch sử, nó có ý nghĩa này. Các Annotated Reference Manual định nghĩa tại trang 343
Một lớp được tạo ra từ một mẫu lớp được gọi là lớp mẫu, như là một lớp học đặc biệt được xác định với một mẫu-class-name như tên của nó
Các không phải là thiết bị đầu cuối mẫu-class-name tương đương với mẫu-thiết bị đầu cuối không được sử dụng trong tiêu chuẩn ngày nay và đi xuống template-name <arguments>
.
Để giúp bạn làm quen với các điều khoản ngày hôm nay, mà quan trọng hơn là sử dụng thuật ngữ cũ đáng ngờ
// (1) defines a class template
template<typename T> class A { };
// (2) defines a class template explicit specialization
template<> class A<int> { };
// (3) defines a class template partial specialization
template<typename T> class A<T*> { };
// (4) explicitly instantiates A<char>.
template class A<char>;
// (5) implicitly instantiates A<short> (because of the member declaration)
struct D { A<short> a; };
- Các ARM được gọi là lớp (2), và các lớp được tạo ra bởi (4) và (5) một lớp mẫu . Tôi không chắc liệu ARM đã biết về các chuyên môn từng phần hay chưa. Nhưng nếu vậy (3) không được gọi là một lớp mẫu, bởi vì (3) không định nghĩa một lớp, nhưng định nghĩa một khuôn mẫu.
- Lớp cuộc gọi Chuẩn hiện tại (2) và các lớp được tạo bởi (4) và (5) các chuyên môn mẫu lớp học. Và (3) được gọi là chuyên môn từng phần, thay vì một chuyên môn rõ ràng rõ ràng. Nó cũng đôi khi gọi (3) một chuyên môn (3.2/5 - tuy nhiên với làm rõ liên kết chéo), mặc dù tôi thấy điều này không hoàn toàn rõ ràng với tôi, vì nó định nghĩa một "chuyên môn" như là một "lớp, chức năng hoặc lớp thành viên ", (3) không thỏa mãn.
+1, tốt đẹp để biết các ủy ban tiêu chuẩn mình thêm vào sự nhầm lẫn này –
Hehe. Vâng và một số người khác cũng vẫn đóng góp cho bộ đó. Đáng chú ý là C++ Faq lite và tài liệu Qt. Tác giả của faq lite đã nói với tôi trong thư rằng anh ta muốn đặt một mục FAQ khác giải thích rằng sử dụng từ "chuyên môn" là tốt hơn vì nó gây ít nhầm lẫn hơn (sử dụng "chuyên môn rõ ràng" cho loại chuyên môn được viết bởi người dùng, sau đó). Các anh chàng Qt nói với tôi rằng họ không muốn sử dụng thuật ngữ "mẫu lớp" .... họ tìm thấy nó quá "không tự nhiên". Quá tệ. –
@ JohannesSchaub-litb: ARM được viết bởi Bjarne Stroustrup và Margaret Ellis, khoảng năm 1991 IIRC. Trích dẫn của bạn từ những mâu thuẫn của ARM [báo giá của SHH từ phiên bản thứ 4 của Bjarne TCPPL] (http://stackoverflow.com/a/39681575/464581). Vì vậy, nó là tốt mà bạn rút ra một sự phân biệt giữa cũ (trước chuẩn) và thuật ngữ hiện tại. –
Lớp mẫu: Lớp có định nghĩa chung hoặc lớp có tham số không được khởi tạo cho đến khi thông tin được cung cấp bởi ứng dụng khách. Nó được gọi là một biệt ngữ cho lớp templates.simply đơn giản với mẫu tiền tố và sử dụng T. Mẫu lớp: Việc xây dựng cá nhân của một lớp được chỉ định bởi một mẫu lớp gần giống như cách các đối tượng riêng lẻ được xây dựng bằng cách sử dụng một lớp. Nó được gọi là một đối tượng của lớp mẫu Tên đối tượng Ex- classname (danh sách đối số)
Mẫu lớp là một lớp chung cho các loại đối tượng khác nhau. Về cơ bản nó cung cấp một đặc điểm kỹ thuật để tạo ra các lớp dựa trên các tham số. Bất cứ khi nào một đối tượng mới được tạo ra một lớp mới sẽ diễn ra trong bộ nhớ cho mục đích đó. Điều này được gọi là instantiating một mẫu lớp và mỗi phiên bản instantiated của lớp được gọi là lớp mẫu.
Bjarne Stroustrup, tác giả của C++, nói trong cuốn sách của ông C++ Programming Language 4th edition, 23.2.1 Xác định một mẫu:
Có những người làm cho sự phân biệt ngữ nghĩa giữa các điều khoản lớp mẫu và mẫu lớp. Tôi không; điều đó sẽ quá tinh tế: hãy xem xét những thuật ngữ này có thể hoán đổi cho nhau. Tương tự, tôi xem xét mẫu chức năng hoán đổi cho nhau với chức năng mẫu.
Được bình chọn, câu trả lời hay. –
- 1. Sự khác biệt giữa mẫu và đường dẫn là gì?
- 2. Sự khác biệt giữa "Lớp" và "Cấp" là gì?
- 3. Thuật ngữ: Sự khác biệt giữa một lớp học và một thành phần là gì?
- 4. Sự khác biệt giữa mẫu bộ điều hợp đối tượng và mẫu bộ điều hợp lớp
- 5. Sự khác biệt giữa các mẫu thiết kế và các mẫu kiến trúc là gì?
- 6. Sự khác biệt giữa chức năng mẫu và chức năng mẫu là gì?
- 7. Sự khác biệt giữa mẫu mặt tiền và mẫu nhà máy abstarct là gì?
- 8. Sự khác biệt giữa một Lớp Tóm tắt và Mixin là gì?
- 9. sự khác biệt giữa `lớp công khai` và chỉ` lớp` là gì?
- 10. Sự khác biệt giữa lớp Debug và lớp Trace là gì?
- 11. Sự khác biệt giữa lớp singleton và lớp tĩnh?
- 12. Sự khác biệt giữa lớp tĩnh và lớp bình thường là gì?
- 13. OOP Sự khác biệt giữa một lớp dẫn xuất và một lớp kế thừa?
- 14. Sự khác nhau giữa một đối tượng và một lớp trong Perl là gì?
- 15. Sự khác biệt thực tế giữa các biểu mẫu và macro đặc biệt là gì?
- 16. Sự khác biệt giữa "mẫu <class T>" và "mẫu <typename T>" là gì?
- 17. Sự khác biệt giữa Proxy và Mẫu trang trí
- 18. Sự khác biệt giữa các câu lệnh này trong một lớp học chung là gì?
- 19. Sự khác nhau giữa mẫu tên và mẫu id
- 20. Sự khác biệt giữa hai trường hợp cùng một lớp
- 21. sự khác biệt giữa "đặc điểm" và "đặc điểm mẫu" là gì?
- 22. Sự khác biệt giữa mẫu thiết kế Singleton và Registry
- 23. trong C# sự khác biệt giữa mẫu chiến lược và đại biểu là gì?
- 24. Sự khác biệt giữa build.sbt và build.scala là gì?
- 25. Sự khác biệt giữa kiểu và mẫu kiểm soát
- 26. Sự khác biệt sử dụng thực tế giữa các mẫu Flyweight và Singleton là gì?
- 27. Sự khác biệt giữa các ô tĩnh và các nguyên mẫu động là gì?
- 28. Sự khác biệt giữa dữ liệu biểu mẫu và tải trọng yêu cầu là gì?
- 29. Sự khác biệt giữa trình trang trí Python và mẫu trang trí là gì?
- 30. Sự khác biệt chức năng giữa một cá thể và một đối tượng là gì?
Câu trả lời đúng. – BobbyShaftoe
+1. Đôi khi nó hữu ích cho bất kỳ lý do gì để phân biệt "nguồn gốc" của một lớp, trong trường hợp này bạn có thể sử dụng thuật ngữ "lớp mẫu" hợp lý - nhưng vì lý do bạn đưa ra, bạn nên xác định ý nghĩa của điều này . –
@j_random_hacker - xem câu trả lời của litb dưới đây, nhưng trong ngắn hạn, thuật ngữ ưa thích cho điều đó là "chuyên môn mẫu lớp" –