Связь классов и членов класса - PullRequest
1 голос
/ 25 января 2020

Вот определения, которые я знаю для внешней и внутренней связи.

Наличие внутренней связи : может использоваться в единице перевода.

Наличие внешней linkage : существующий вне определенной единицы перевода, доступный через всю программу.

Вот пример:

Скажем, у меня есть файл заголовков с именем Ah где я объявляю члены класса и методы членов (конструктор, деструктор ...). В файле cpp с именем A. cpp я определяю эти методы.

В главном файле. cpp, в который я включил свой заголовочный файл, я создаю объект типа A с конструктором класс А.

Теперь скажите, что я объявил членов класса А личными или защищенными, я не могу получить к ним доступ через свой основной файл. cpp. Если я объявлю их как публичные c, то смогу.

Вот мой вопрос : имеет ли смысл говорить, что у членов класса А есть внутренняя связь, когда я объявляю их частными или защищенными ?

Я очень смущен тем, что на самом деле представляет связь, и когда говорить о внутренней или внешней связи возможно.

1 Ответ

0 голосов
/ 25 января 2020

Теперь скажите, что я объявил членов класса А личными или защищенными, я не могу получить к ним доступ через свой основной файл. cpp.

Да, вы можете. Просто возьмите одно из этих определений из A.cpp и переместите их в main.cpp. Это определение сможет получить доступ к приватным членам A. Это совершенно законно и допустимо C ++.

Контроль доступа (public / private / et c) определяет, какой код может называть членов этого класса. Они не контролируют , где эти члены определены. То есть элементы управления доступом могут скрывать имена на основе заданного c контекста кода, в котором появляются эти имена, а не файла, в котором появляется имя.

Связывание (частично) управляет видимостью имен через вся программа относительно определенной c единицы перевода (aka: исходный файл), в которой это имя было объявлено / определено. Linkage очень заботится о том, в каких файлах появляется имя, относительно того, где это имя было объявлено / определено.

При этом члены типа вообще не имеют связи. Вы можете считать, что они имеют ту же связь, что и сам тип. Связь применяется к объявлениям и определениям пространств имен / глобальных областей, а не к членам класса.

...