Мой код: —
#include<iostream>
using namespace std;
class a{
private:
int x;
public:
a(int data)
{
x=data;
}
friend void printPrivateMember(a);
};
void printPrivateMember(a obj)
{
cout<<obj.x; //I can access private data member by an object inside this function.
}
int main()
{
a obj1(5);
printPrivateMember(obj1);
cout<<obj1.x; //this gives error
return 0;
}
Я хотел знать, как я могу получить доступ к типу данных PRIVATE с помощью объекта в функции друга, но не могу сделать это в main.
Когда я читаю о спецификаторе доступа. Было указано, что private может быть доступен только функциям-членам (у меня нет проблем с функцией Friend), а не объекту этого класса. Я хотел знать, какая разница, из-за которой я могу получить доступ к закрытому члену с помощью объекта в одном случае и не могу сделать это в другом. То же самое применимо для конструктора копирования.
Это именно то, что делают функции друзей: любая функция друга класса может получить доступ к своим закрытым членам. Так как ваш printPrivateMember
объявлен другом a
, он может получить доступ к частной x
член. Так как main не является функцией друга, он не может.
Предустановка вопроса об объявлении main
как друг, этот вопрос покрывает это.
Потому что друзья могли это сделать.
$ 11/1 член контроля доступа [class.access]
(акцент мой)
1 Членом класса может быть
(1.1) — частный; то есть его имя может быть
используется только членами и друзья класса в котором это
объявлен.
(1.2) — защищенный; то есть его имя может использоваться только
члены и друзья класса, в котором это объявлено, классами
полученные из этого класса, и их друзьями (см. 11.4).
(1.3) —
общественности; то есть его имя можно использовать где угодно без доступа
ограничение.
Как вы правильно заметили, только функции-члены (включая конструкторы и деструкторы) и friend
функции и классы могут получить доступ к вам private
s. Это цель friend
s: они предоставляют исключение (не std::exception
) к механизму инкапсуляции.
Теперь вы можете подумать, нарушает ли это инкапсуляцию или фактически стабилизирует ее.
если вы хотите получить доступ к приватному члену, вам лучше использовать публичную функцию, такую как:
class a {
private:
int m;
public:
int getM() {
return m;
}
};
Ваше использование фразы не объектом этого класса заставляет меня думать, что вы не знаете правила доступа. Правила доступа не применяются к объектам, но могут обращаться к переменным и функциям-членам объектов.
К переменной-члену класса можно получить доступ в функции, которая может быть функцией-членом класса, функцией-членом другого класса или глобальной функцией.
Он также может быть доступен в глобальном пространстве, например, инициализировать глобальную переменную.
friend
объявление в классе изменяет правила доступа по умолчанию, которые применяются с помощью private
, protected
, а также public
Спецификаторы доступа.
Функция объявила friend
класса могут получить доступ ко всем членам всех экземпляров класса.
ответ от songyuanyao цитирует раздел стандарта, который предоставляет более подробную информацию по этому вопросу.
Эта функция должна быть общедоступной, чтобы вы могли получить к ней доступ через main ().
void print(){
/**print or return your private variable here**/
}