2012-07-07 40 views
7

Mã sau được biên dịch tốt (không có dấu chấm phẩy sau mỗi dòng). Tại sao dấu chấm phẩy không cần thiết ở cuối mỗi dòng trong phần công khai?Dấu chấm phẩy tùy chọn trong C++

Lưu ý: đặt dấu chấm phẩy sau mỗi dòng cũng được, vì vậy có vẻ như sử dụng dấu chấm phẩy ở đây là tùy chọn.

template<typename T> 

class Accessor { 

    public: 

     explicit Accessor(const T& data) : value(data) {} 

     Accessor& operator=(const T& data) { value = data; return *this; } 
     Accessor& operator=(const Accessor& other) { this->value = other.value; return *this; } 
     operator T() const { return value; } 
     operator T&() { return value; } 

    private: 

     Accessor(const Accessor&); 
     T value; 
}; 
+0

Các câu lệnh này là các định nghĩa hàm (phương pháp). Bạn không cần phải đặt ';' sau phần thân của hàm. –

+0

Kiểm tra điều này: http://stackoverflow.com/questions/785686/in-c-classes-why-the-semi-colon-after-the-closing-brace – Jack

+0

IIRC, '-pedantic' trên GCC than phiền nếu bạn đặt dấu chấm phẩy sau khi định nghĩa hàm. – chris

Trả lời

1

Bạn không phải đặt dấu chấm phẩy sau khi đóng dấu ngoặc đơn khai báo phương thức. Trong hầu hết các mã tôi đã thấy không có dấu chấm phẩy như vậy.

+0

Điều này không đúng, nếu dấu chấm phẩy bị bỏ qua trước chính(), nó sẽ không được biên dịch. –

+0

Ý của bạn là gì trước main()? Bạn đang đề cập đến một chính() trong cùng một tệp, sau khi khai báo lớp? – davidrac

+0

có. Tôi đang đề cập đến một chính() trong cùng một tệp, sau khi khai báo lớp. –

0

Vì quy tắc C++ không yêu cầu dấu chấm phẩy sau } trong khai báo hàm/phương thức.

+0

kết thúc dấu ngoặc đơn thường biểu thị phần cuối của một phần, chẳng hạn như kết thúc câu lệnh lớp; do đó, nếu điều này được theo sau bởi hàm main() mà không có dấu chấm phẩy sau câu lệnh lớp cuối cùng, trình biên dịch sẽ không được biên dịch. –

6

Mã của bạn là chính xác. Đó là cách ngôn ngữ hoạt động; bạn không cần dấu chấm phẩy sau phần thân của một phương thức/hàm thực hiện.

Nếu bạn thêm dấu chấm phẩy, không có gì xấu xảy ra vì một câu lệnh trống có dấu chấm phẩy giống như một dấu chấm phẩy. Ví dụ: x += y;; là hợp pháp C++.

10

Bạn không cần dấu chấm phẩy sau định nghĩa phương thức.

Lý do một dấu chấm phẩy là cần thiết sau khi một định nghĩa lớp là bạn có thể tuyên bố thể hiện của lớp ngay sau khi định nghĩa:

class X 
{ 

} x; 

//x is an object of type X 

Đối với phương pháp, lập luận này rõ ràng là không nắm giữ, do đó, một dấu chấm phẩy sẽ được thừa (mặc dù hợp pháp).

+0

+1. Lời giải thích hay. Vì vậy, đó là lý do thực sự cho lớp/struct và enums yêu cầu một; sau khi ngoặc đơn :) – Jack

+0

những gì về khi chúng ta bỏ qua dấu chấm phẩy sau khi Accessor (const Accessor &) Đây không phải là một phương pháp? nếu chúng ta bỏ qua dấu chấm phẩy, trình biên dịch sẽ không được biên dịch. –

+1

@ZzzZz Đó là khai báo hàm thành viên cần được xác định ở đâu đó trong chương trình. trong khi những người khác như đã đề cập trong câu trả lời của tôi là các định nghĩa hàm thành viên được viết bên trong lớp. –

1

Để được rõ ràng,

explicit Accessor(const T& data) : value(data) {} 

tương đương với

explicit Accessor(const T& data) 
:value(data) // initializer list 
{ 
} 

Đó là một định nghĩa hàm thành viên. Ở đây đặt một dấu chấm phẩy ở cuối của chữ ký chức năng làm cho nó một thành viên chức năng khai mà cần phải được định nghĩa ở đâu đó trong các chương trình bên ngoài lớp như dưới đây

Accessor::Accessor(const T& data) 
{ 
    // some code 
} 

Ngoài ra, như câu trả lời khác cho thấy, cuối cùng của một thân hàm không yêu cầu dấu chấm phẩy sau dấu ngoặc đóng (kết thúc định nghĩa lớp hoặc cấu trúc không yêu cầu nó) nhưng thêm một dấu chấm ở cuối sẽ không tạo sự khác biệt vì nó được coi là không có và là lý do tại sao bạn có thể thêm dấu chấm phẩy ở cuối.

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