2010-07-06 39 views
26

Tôi đang xem các không gian tên và tôi thực sự không thấy sự khác biệt giữa các lớp và lớp này. Tôi đang tự dạy mình C++ Tôi đã nhận được nhiều cuốn sách trực tuyến, vì vậy tôi biết tôi không học được hiệu quả nhất từ ​​ . Anyways ai đó có thể cho tôi biết sự khác biệt giữa hai và những gì sẽ là thời gian tốt nhất để sử dụng một tên gọi trên một lớp học. Ngoài ra, tôi không thấy nhiều về cấu trúc trong cuốn sách tôi đang đọc.Sự khác biệt giữa các lớp và không gian tên?

Đây có phải là định dạng không?

struct go 
{ 

    goNow(){ cout << "go Now"}; 

} 

cảm ơn trước sự hỗ trợ của bạn.

+0

này [chuyện] (http://stackoverflow.com/questions/713698/c-namespaces-advice?lq=1) có thể giúp bạn đánh giá cao vai trò của không gian tên. – jxramos

+0

Thật thú vị khi tôi không thấy bất kỳ ai đề cập rằng quyền truy cập vào các thành viên và chức năng của lớp học có thể được kiểm soát bởi lớp hoặc cấu trúc thông qua công khai, được bảo vệ, riêng tư, v.v. – user8381651

Trả lời

57

Lớp và cấu trúc xác định loại. Bạn có thể tạo một đối tượng của một loại. Không gian tên chỉ đơn giản là tuyên bố một phạm vi bên trong mà các loại, chức năng, đối tượng, hoặc không gian tên có thể tồn tại. Bạn không thể tạo một đối tượng kiểu std (trừ khi bạn đã tạo một kiểu gọi là std, sẽ ẩn không gian tên std).

Khi bạn xác định hàm bên trong cấu trúc/lớp (phương pháp) bạn đang nói "Hàm này là thao tác cơ bản trên dữ liệu được liên kết". Khi bạn định nghĩa một hàm bên trong một không gian tên bạn đang nói "Chức năng này được một cách hợp lý liên quan đến các chức năng khác, chủng loại, và các đối tượng trong không gian tên"

Sửa

Đây có thể là giá trị chỉ ra rằng "mọi thứ đều một đối tượng "các ngôn ngữ như Java và C# thường xuyên sử dụng các lớp như thể chúng là các không gian tên bởi vì chúng không cho phép các hàm" tự do ". Đây có thể là nơi sự nhầm lẫn xuất phát từ đó. Nếu bạn có một lớp bằng ngôn ngữ khác không chứa gì ngoài các thành viên tĩnh, bạn sẽ muốn sử dụng một không gian tên và các hàm miễn phí trong phiên bản C++.

+16

+1. Về cấu trúc: 'class' và' struct' về cơ bản là giống nhau - chúng thường được gọi là "kiểu do người dùng xác định". Điểm khác biệt duy nhất là 'class' làm cho các thành viên và các lớp cơ sở được mặc định là private, trong khi' struct' làm cho chúng trở thành public. –

+3

Tôi đã tìm thấy Scott Meyers đăng bài trên [Làm thế nào để không phải là thành viên chức năng cải thiện đóng gói] (http://www.drdobbs.com/cpp/how-non-member-functions-improve-encapsu/184401197) là khá hữu ích khi tìm hiểu về khi nào sử dụng các không gian tên. – PythonJin

0

Từ wikipedia

Nói chung, một không gian tên là nơi chứa trừu tượng cung cấp bối cảnh cho các mục (tên, hoặc các điều khoản kỹ thuật, hoặc từ) nó giữ và cho phép định hướng các mặt hàng đồng âm có cùng tên (trú trong các không gian tên khác nhau). Theo quy tắc, tên trong không gian tên không thể có nhiều hơn một chính tả, nghĩa là các thành phần của nó không được chia sẻ cùng một tên. Một không gian tên cũng được gọi là ngữ cảnh, vì ý nghĩa hợp lệ của một tên có thể thay đổi tùy thuộc vào không gian tên nào được áp dụng. Tên trong đó có thể đại diện cho các đối tượng cũng như khái niệm, cho dù đó là ngôn ngữ tự nhiên hay dân tộc, ngôn ngữ được xây dựng, thuật ngữ kỹ thuật của một nghề, phương ngữ, xã hội học hoặc ngôn ngữ nhân tạo (ví dụ: ngôn ngữ lập trình).

Mặt khác, A class defines a type.

Không gian tên có thể chứa nhiều lớp.

EDIT

Một sự khác biệt sẽ là:

Bạn có thể có không gian tên vô danh nhưng bạn không thể có một lớp vô danh

namespace{ //fine 

      //some code.... 
    } 

    class{ //illegal 
    } 
+4

Tôi không thực sự thấy cách văn bản được trích dẫn có liên quan đến C++. –

+2

Không gian tên có vai trò khác (somwhat cụ thể) trong C++ không? Có gì sai với văn bản được trích dẫn. –

7

Một namespace là một cách để nhóm định danh để họ không đụng độ.

Một lớp là định nghĩa của một đối tượng có thể được khởi tạo (thường) và nó đóng gói chức năng và trạng thái.

Không gian tên và lớp học hoàn toàn khác nhau và phục vụ các mục đích khác nhau. Họ có một số tương tự cú pháp.

Structs là các lớp, với một trình chỉ định truy cập mặc định khác (công khai cho cấu trúc, riêng cho lớp) - trong tất cả các khía cạnh khác, chúng giống nhau.

22

Bạn có thể tìm kiếm trên web để tìm sự khác biệt và tôi chắc chắn bạn sẽ tìm thấy nhiều; nhưng sau đây là quan trọng IMHO: -

  • Bạn có thể mở lại một không gian tên và thêm nội dung trên các đơn vị dịch thuật. Bạn không thể làm điều này với các lớp học.
  • Sử dụng lớp học ngụ ý rằng bạn có thể tạo một phiên bản của lớp đó, chứ không phải đúng với các không gian tên.
  • Bạn có thể sử dụng các khai báo sử dụng với không gian tên và điều đó là không thể với các lớp trừ khi bạn lấy được từ chúng.
  • Bạn có thể có các không gian tên chưa đặt tên.

Không gian tên xác định phạm vi mới và thành viên của không gian tên được cho là có phạm vi không gian tên. Chúng cung cấp một cách để tránh xung đột tên (của các biến, kiểu, lớp hoặc hàm) mà không có sự bất tiện khi xử lý các lớp lồng nhau.

10

A lớp là loại dữ liệu. Nếu bạn có một lớp có tên là Foo, bạn có thể tạo các đối tượng của lớp Foo và sử dụng chúng theo nhiều cách.

A không gian tên chỉ đơn giản là cách trừu tượng để nhóm các mục lại với nhau. Thông thường, bạn không thể có hai chức năng trong chương trình của mình có tên là bar(). Nếu bạn đặt chúng trong các không gian tên riêng biệt, thì chúng có thể cùng tồn tại (ví dụ: A::bar()B::bar()). Một không gian tên không thể được tạo ra như một đối tượng; nghĩ về nó nhiều hơn như một quy ước đặt tên.

Nếu bạn đang viết mã mà bạn muốn được liên kết với một đối tượng mà bạn có thể xác định và sử dụng làm biến, hãy viết lớp. Nếu bạn đang viết một API hoặc thư viện và bạn muốn kết thúc tất cả các hàm và hằng số sao cho tên của chúng không xung đột với bất kỳ thứ gì mà người dùng có thể đã viết, hãy sử dụng một không gian tên .

5

Một khác biệt chính là không gian tên có thể được mở lại, nhưng các lớp học không có thể là:

namespace A { 
    int f1(); 
} 

namespace A { 
    int f2(); 
} 

là hợp pháp, nhưng:

class A { 
    int f1(); 
}; 

class A { 
    int f2(); 
}; 

không phải là

Các vấn đề liên quan