2009-04-24 26 views
62

Xin lỗi trước cho câu hỏi có thể là một câu hỏi ngu ngốc, nhưng trong các lớp C++, tại sao dấu chấm phẩy sau dấu ngoặc đóng? Tôi thường xuyên quên nó và nhận được lỗi biên dịch, và do đó mất thời gian. Có vẻ hơi thừa kế với tôi, điều này dường như không xảy ra. Có phải mọi người thực sự làm những việc nhưSemi Colon sau dấu ngoặc móc lớp

class MyClass 
{ 
. 
. 
. 
} MyInstance; 

Edit: tôi nhận được nó từ một quan điểm tương thích C xem cho cấu trúc và sự đếm, nhưng kể từ khi các lớp học không phải là một phần của ngôn ngữ C Tôi đoán nó là chủ yếu có pháo đài sự nhất quán giữa các cấu trúc khai báo tương tự. Những gì tôi đang tìm kiếm có liên quan nhiều hơn đến lý do thiết kế hơn là có thể thay đổi bất cứ điều gì, mặc dù một IDE hoàn thành mã tốt có thể bẫy điều này trước khi biên dịch.

+4

này có thể giúp: http://www.cpptalk.net/confused-about-the-meaning-of-the-semicolon-vt11965.html –

+0

@ Michael, nhờ cho liên kết. Từ góc độ lịch sử, nó có ý nghĩa tốt, và nếu C++ cho phép tất cả các ngữ pháp C, và các lớp C++ là đồng bộ với các cấu trúc, chúng ta được để lại với dấu chấm phẩy cần thiết ở cuối lớp. –

+3

@Brian, yup câu hỏi nghiêm túc. Tôi biết rõ tôi phải sống với nó nhưng tôi tò mò về lý do đằng sau thiết kế và thực hiện. –

Trả lời

38

Dấu chấm phẩy sau khi dấu ngoặc đóng trong khai báo kiểu được yêu cầu bởi ngôn ngữ. Theo cách đó, từ các phiên bản đầu tiên của C.

Và có, mọi người thực sự thực hiện tuyên bố bạn vừa đưa lên đó. Nó rất hữu ích cho việc tạo kiểu scoped bên trong các phương thức.

void Example() { 
    struct { int x; } s1; 
    s1.x = 42; 

    struct ADifferentType { int x; }; 
} 

Trong trường hợp này, tôi nghĩ rõ ràng tại sao bán dấu hai chấm là cần thiết. Về lý do tại sao nó cần thiết trong trường hợp tổng quát hơn về khai báo trong tệp tiêu đề tôi không chắc chắn. My đoán là lịch sử của nó và đã được thực hiện để làm cho trình biên dịch dễ dàng hơn.

+0

Tại sao tôi không thể tạo kiểu phạm vi mà không chỉ định MyInstance? Nó đường nối kỳ lạ khi bạn kết hợp hai hành động: khai báo kiểu mới và khai báo biến mới. –

+0

@ Mykola bạn có thể làm cả hai. Xem mẫu tôi đã thêm – JaredPar

15

Tôi đoán đó là vì các lớp là khai báo, ngay cả khi chúng cần niềng răng để nhóm. Và vâng, có lập luận lịch sử mà vì trong C bạn có thể làm

struct 
{ 
    float x; 
    float y; 
} point; 

bạn nên trong C++ có thể làm một điều tương tự, nó có ý nghĩa đối với việc kê khai class cư xử theo cách tương tự.

7

Đó là viết tắt của

class MyClass 
{ 
. 
. 
. 
}; 

// instance declaration 
MyClass MyInstance; // semicolon here 

Các dấu chấm phẩy sau dấu ngoặc nhọn của việc kê khai lớp thực sự là quá mức cần thiết, nhưng nó là như thế nào C++ được định nghĩa. Dấu chấm phẩy sau khi khai báo biến luôn luôn cần thiết và có ý nghĩa.

+0

Vì vậy, C++ có yêu cầu dấu chấm phẩy sau mỗi khai báo không? –

+0

Lưu ý rằng, theo cách này, bạn không thể tạo một đối tượng của một lớp ẩn danh, trong khi bạn có thể theo cách khác. – Kevin

2

tôi không sử dụng tờ khai

class MyClass 
{ 
. 
. 
. 
} MyInstance; 

Nhưng trong trường hợp này tôi có thể hiểu tại sao dấu chấm phẩy ở đó.
Vì nó giống như int a; - khai báo biến.

Có thể cho sự nhất quán khi bạn có thể bỏ qua dấu chấm phẩy 'MyInstance' ở đó.

2

Nó là cần thiết sau một struct vì những lý do tương thích, và sẽ như thế nào bạn như thế này:

struct MyStruct { ... }; 
class MyClass { ... } //inconsistency 
2

Trong C/C++; là một người kết thúc câu lệnh. Tất cả các câu lệnh được chấm dứt; để tránh sự mơ hồ (và đơn giản hóa phân tích cú pháp). Ngữ pháp phù hợp với khía cạnh này. Mặc dù tuyên bố lớp học (hoặc bất kỳ khối nào cho vấn đề đó) là nhiều dòng dài và là được phân cách bằng {} nó vẫn đơn giản là một câu lệnh ({} là một phần của câu lệnh) do đó cần phải chấm dứt; (The; không phải là một dấu phân cách/delimitor)

Trong ví dụ của bạn

class MyClass{...} MyInstance; 

là tuyên bố đầy đủ. Người ta có thể xác định nhiều trường hợp của các lớp tuyên bố trong một tuyên bố đơn

class MyClass{...} MyInstance1, MyInstance2; 

này là hoàn toàn phù hợp với tuyên bố nhiều trường hợp của một loại nguyên thủy trong một tuyên bố duy nhất:

int a, b, c; 

Lý do người ta không làm thường thấy desclaration như vậy của lớp và dụ, là trường hợp có thể? chỉ? là một biến toàn cục và bạn không thực sự muốn các đối tượng chung trừ khi chúng là các cấu trúc dữ liệu cũ và/hoặc đồng bằng.

+0

Nhưng định nghĩa hàm cũng là một câu lệnh nhưng không có dấu chấm phẩy. –

39

link do @MichaelHeran cung cấp dường như cung cấp nguyên nhân gốc gốc. Dấu chấm phẩy (như những người khác đã chỉ ra) được thừa hưởng từ C. Nhưng điều đó không giải thích tại sao C sử dụng nó ở nơi đầu tiên. Cuộc thảo luận bao gồm viên đá quý này là một ví dụ:

struct fred { int x; long y; }; 
main() 
{ 
    return 0; 
} 

Phiên bản cũ của C có kiểu trả về ngầm từ một hàm trừ khi được khai báo khác. Nếu chúng tôi bỏ qua ; ở cuối định nghĩa cấu trúc, chúng tôi không chỉ xác định loại mới fred, mà còn tuyên bố rằng main() sẽ trả lại phiên bản fred. I E. mã sẽ được phân tích như thế này:

struct fred { int x; long y; } main() 
{ 
    return 0; /* invalid return type, expected fred type */ 
} 
+4

Đây phải là câu trả lời được chấp nhận. – nikoliazekter

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