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:
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. –
@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ể đó. –
Không, nó không thể hiển thị cho tôi phần tiêu chuẩn nói điều này? –