2012-09-24 35 views
5

Giả sử tôi có một lớp học với một hai hàm inline:Tại sao các hàm nội tuyến được phép thao tác biến thành viên riêng?

class Class { 
public: 
    void numberFunc(); 
    int getNumber() { return number; } 
private: 
    int number; 
}; 

inline void Class::numberFunc() 
{ 
    number = 1937; 
} 

tôi nhanh chóng lớp đó và tôi gọi cả hai chức năng trong lớp:

int main() { 
    Class cls; 
    cls.numberFunc(); 
    cout << cls.getNumber() << endl; 
    return 0; 
} 

Tôi hiểu rằng cả hai chức năng inline vẫn còn các thành viên của lớp, nhưng nó cũng là sự hiểu biết của tôi rằng mã bên trong nội dung của một hàm nội tuyến chỉ được chèn vào vị trí của nó được gọi. Dường như, như là kết quả của chèn rằng, tôi không nên có thể truy cập trực tiếp các thành viên biến number vì, theo như tôi biết, các mã trong main() để trình biên dịch sẽ trông như thế:

main() { 
    Class cls; 
    cls.number = 1937; 
    cout << cls.number << endl; 
    return 0; 
} 

Can ai đó giải thích cho tôi lý do tại sao tôi vẫn có thể truy cập vào các thành viên riêng tư đó hoặc sửa tôi về sự hiểu biết của tôi về các chức năng nội tuyến? Tôi biết rằng trình biên dịch có tùy chọn bỏ qua inline trên một số chức năng; là những gì đang xảy ra ở đây?

Output:

Trả lời

9

Quy tắc truy cập thành viên riêng tư của một lớp được thực thi bởi trình biên dịch trên mã C++ của bạn. Các quy tắc này không áp dụng trực tiếp cho đầu ra của trình biên dịch, đó là mã mà một máy tính xuất hiện.

4

Các private truy cập specifier là một hạn chế về người dùng của lớp (các lập trình viên), không phải trên trình biên dịch. Trình biên dịch có thể làm bất cứ điều gì nó muốn, miễn là hành vi quan sát của chương trình là như nhau.

+0

Không - trình biên dịch phù hợp không thể thực hiện những gì nó muốn - trình xác định truy cập được đánh giá trong một bước biên dịch cụ thể - sau khi chúng không được kiểm tra lại. –

+2

@AdrianCornish: Trình biên dịch tuân thủ có thể loại bỏ các cấp truy cập bất cứ khi nào nó muốn, miễn là nó xuất hiện như thể chúng được đánh giá ở bước cụ thể đó. –

+0

Không, nó không thể hiển thị cho tôi phần tiêu chuẩn nói điều này? –

6

Từ khóa inline có nghĩa là lập trình viên nghĩ rằng trình biên dịch có thể nếu muốn chèn mã vào vị trí của cuộc gọi. Trình biên dịch có thể nội tuyến các chức năng khác quá mà không có từ khóa. Trình biên dịch có thể nghĩ rằng lập trình viên là kẻ ngốc và bỏ qua từ khóa chứ không phải nội tuyến. Đó là tất cả theo tiêu chuẩn C++.

Chức năng thành viên nội tuyến là chức năng thành viên khác khá bình thường. Không có đặc quyền hoặc hạn chế nào khác.

Nội tuyến không gây ra lỗi mà hàm được xác định bởi nhiều đơn vị biên dịch (bao gồm tệp tiêu đề trong đó hàm nội tuyến được xác định). Đó có thể là một lý do tại sao mọi người viết các hàm nội tuyến.

+0

'inline' cũng cho phép vi phạm quy tắc ODR. –

+0

Tôi sẽ thêm nó, cảm ơn, có thể đó là một trong những lý do tại sao các dòng được sử dụng. –

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