Предположим, у меня есть класс с двумя встроенными функциями:
class Class {
public:
void numberFunc();
int getNumber() { return number; }
private:
int number;
};
inline void Class::numberFunc()
{
number = 1937;
}
Я создаю экземпляр этого класса и вызываю обе функции в классе:
int main() {
Class cls;
cls.numberFunc();
cout << cls.getNumber() << endl;
return 0;
}
Я понимаю, что обе встроенные функции все еще являются членами класса, но я также понимаю, что код внутри тела встроенной функции просто вставляется вместо того места, где он был вызван. Похоже, что в результате этой вставки я не смог получить прямой доступ к переменной-члену number
потому что, насколько я знаю, код в main()
чтобы компилятор выглядел бы так:
main() {
Class cls;
cls.number = 1937;
cout << cls.number << endl;
return 0;
}
Может кто-нибудь объяснить мне, почему я все еще могу получить доступ к этим частным пользователям, или поправить меня в моем понимании встроенных функций? Я знаю, что компиляторы имеют возможность игнорировать inline
по некоторым функциям; это то, что здесь происходит?
Выход:
1937
Правила доступа к закрытым членам класса применяются компилятором в вашем коде C ++. Эти правила не применяются непосредственно к выводу компилятора, то есть к коду, который ожидает компьютер.
inline
Ключевое слово означает, что программист думает, что компилятор может, если он так хочет вставить код в месте вызова. Компилятор может также встроить другие функции без ключевого слова. Компилятор может подумать, что программист дурак и игнорирует ключевое слово, а не inline. Это все по стандарту C ++.
Встроенная функция-член в остальном является вполне нормальной функцией-членом. Никаких других привилегий или ограничений.
Встроенные строки не вызывают ошибок, так как функция определяется несколькими блоками компиляции (включая заголовочный файл, в котором определена встроенная функция). Это может быть одной из причин, почему люди пишут встроенные функции.
private
Спецификатор доступа является ограничением для пользователей класса (программистов), а не для компилятора. Компилятор может делать все, что захочет, при условии, что наблюдаемое поведение программы одинаково.