Theo mặc định, sử dụng các chức năng được đặt tên.
Các lớp là để xây dựng các đối tượng, không phải để thay thế các không gian tên.
Trong mã hướng đối tượng
Scott Meyers đã viết toàn bộ Mục cho cuốn sách C ++ hiệu quả của mình về chủ đề này, "Thích các chức năng không phải là thành viên không phải là thành viên". Tôi tìm thấy một tài liệu tham khảo trực tuyến về nguyên tắc này trong một bài viết từ Herb Sutter:http://www.gotw.ca/gotw/084.htm
Điều quan trọng cần biết là: Trong các hàm C ++ trong cùng một không gian tên với một lớp thuộc giao diện của lớp đó (vì ADL sẽ tìm kiếm các hàm đó khi giải quyết các lệnh gọi hàm).
Các hàm được đặt tên, trừ khi được khai báo là "bạn bè", không có quyền truy cập vào bên trong của lớp, trong khi các phương thức tĩnh thì có.
Điều này có nghĩa là, ví dụ, khi duy trì lớp của bạn, nếu bạn cần thay đổi nội bộ của lớp, bạn sẽ cần tìm kiếm các tác dụng phụ trong tất cả các phương thức của nó, bao gồm cả các phương thức tĩnh.
Gia hạn tôi
Thêm mã vào giao diện của lớp.
Trong C #, bạn có thể thêm các phương thức vào một lớp ngay cả khi bạn không có quyền truy cập vào nó. Nhưng trong C ++, điều này là không thể.
Nhưng, vẫn trong C ++, bạn vẫn có thể thêm một hàm được đặt tên, ngay cả với một lớp mà ai đó đã viết cho bạn.
Nhìn từ phía bên kia, điều này rất quan trọng khi thiết kế mã của bạn, bởi vì bằng cách đặt các chức năng của bạn vào một không gian tên, bạn sẽ ủy quyền cho người dùng của mình tăng / hoàn thành giao diện của lớp.
Gia hạn II
Một tác dụng phụ của điểm trước đó, không thể khai báo các phương thức tĩnh trong nhiều tiêu đề. Mọi phương thức phải được khai báo trong cùng một lớp.
Đối với không gian tên, các hàm từ cùng một không gian tên có thể được khai báo trong nhiều tiêu đề (hàm hoán đổi gần như tiêu chuẩn là ví dụ tốt nhất về điều đó).
Gia hạn III
Sự mát mẻ cơ bản của một không gian tên là trong một số mã, bạn có thể tránh đề cập đến nó, nếu bạn sử dụng từ khóa "bằng cách sử dụng":
#include <string>
#include <vector>
// Etc.
{
using namespace std ;
// Now, everything from std is accessible without qualification
string s ; // Ok
vector v ; // Ok
}
string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR
Và bạn thậm chí có thể giới hạn "ô nhiễm" trong một lớp:
#include <string>
#include <vector>
{
using std::string ;
string s ; // Ok
vector v ; // COMPILATION ERROR
}
string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR
"Mẫu" này là bắt buộc để sử dụng đúng thành ngữ hoán đổi gần như tiêu chuẩn.
Và điều này là không thể thực hiện với các phương thức tĩnh trong các lớp.
Vì vậy, không gian tên C ++ có ngữ nghĩa riêng.
Nhưng nó đi xa hơn, vì bạn có thể kết hợp các không gian tên theo cách tương tự như thừa kế.
Ví dụ: nếu bạn có không gian tên A có chức năng AAA, không gian tên B có chức năng BBB, bạn có thể khai báo không gian tên C và đưa AAA và BBB vào không gian tên này bằng từ khóa.
Phần kết luận
Không gian tên dành cho không gian tên. Các lớp học dành cho các lớp học.
C ++ được thiết kế để mỗi khái niệm là khác nhau và được sử dụng khác nhau, trong các trường hợp khác nhau, như là một giải pháp cho các vấn đề khác nhau.
Đừng sử dụng các lớp khi bạn cần không gian tên.
Và trong trường hợp của bạn, bạn cần không gian tên.