Почему встроенным функциям разрешено манипулировать закрытыми переменными-членами?

Предположим, у меня есть класс с двумя встроенными функциями:

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

6

Решение

Правила доступа к закрытым членам класса применяются компилятором в вашем коде C ++. Эти правила не применяются непосредственно к выводу компилятора, то есть к коду, который ожидает компьютер.

10

Другие решения

inline Ключевое слово означает, что программист думает, что компилятор может, если он так хочет вставить код в месте вызова. Компилятор может также встроить другие функции без ключевого слова. Компилятор может подумать, что программист дурак и игнорирует ключевое слово, а не inline. Это все по стандарту C ++.

Встроенная функция-член в остальном является вполне нормальной функцией-членом. Никаких других привилегий или ограничений.

Встроенные строки не вызывают ошибок, так как функция определяется несколькими блоками компиляции (включая заголовочный файл, в котором определена встроенная функция). Это может быть одной из причин, почему люди пишут встроенные функции.

6

private Спецификатор доступа является ограничением для пользователей класса (программистов), а не для компилятора. Компилятор может делать все, что захочет, при условии, что наблюдаемое поведение программы одинаково.

5
По вопросам рекламы [email protected]