2015-10-21 6 views
1

Моего кода: -Как функция получает доступ к частному элементу данных объекта класса?

#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 типа данных с помощью объекта в функции друга, но не могу сделать это в основном.

Когда я прочитал о спецификаторе доступа. Было указано, что к частным могут быть доступны только функции-члены (у меня нет проблемы с функцией friend), а не объектом этого класса. Я хотел знать, какая разница, из-за чего я могу получить доступ к частному члену объектом в одном случае и не могу сделать это в другом. То же самое применимо и для конструктора копирования.

+0

Вы можете использовать концепцию функции друга. –

ответ

1

Это то, что делают другие функции: любая функция друга класса может получить доступ к своим частным членам. Так как ваш printPrivateMember объявлен другом a, он может получить доступ к его частному члену x. Поскольку main не является функцией друга, он не может.

Вопросы, связанные с объявлением main в качестве друга, this question покрывает его.

+0

Я хотел знать, как мы получаем доступ к частному члену объектом класса. Нам не нужна функция-член для доступа к ним? – Echo

+0

@SudeshnaBora, нет, вы можете получить к ним доступ прямо из любого места, если они являются общедоступными, а также из функций друзей или классов друзей, даже если эти участники не являются общедоступными. – SingerOfTheFall

+0

@SudeshnaBora Да, вам нужна функция-член ** или ** «друг». Но это просто поведение, которое вы наблюдали в своей примерной программе. – Downvoter

0

Как вы правильно заметили, только функции-члены (включая конструкторы и деструкторы) и функции friend могут получить доступ к вам: private. Это цель friend s: они обеспечивают исключение (неstd::exception) механизму инкапсуляции.

Теперь вы можете подумать о том, что это разрушает инкапсуляцию или фактически стабилизирует ее.

1

Потому что друзья могут это сделать.

$11/1 Member access control [class.access]

(курсив мой)

1 Член класса может быть

(1,1) - частное; то есть его имя может быть , используемое только членами и друзьями класса, в котором указано .
(1.2) - защищенный; то есть его имя может использоваться только членами и друзьями класса, в котором оно объявлено, по классам , полученным из этого класса, и их друзьями (см. 11.4).
(1.3) - общественное; то есть его имя можно использовать везде без доступа ограничение.

0

, если вы хотите получить доступ к закрытому члену, лучше использовать публичную функцию, как:

class a { 
private: 
    int m; 
public: 
    int getM() { 
    return m; 
    } 
}; 
0

Использование фразы не объектом этого класса заставляет меня думать, что вы неясны в правилах доступа. Правила доступа не применяются к объектам, но имеют доступ к переменным-членам и функциям-членам объектов.

Доступ к переменной-члену класса можно получить в функции, которая может быть функцией-членом класса, функции-члена другого класса или глобальной функции.

Он также может быть доступен в глобальном пространстве, например. для инициализации глобальной переменной.

friend декларация в классе меняет правила доступа по умолчанию, которые находятся в месте использования private, protected и public спецификаторов доступа.

Функция, объявленная классом friend, может получить доступ ко всем членам всех экземпляров класса.

answer by songyuanyao цитирует раздел стандарта, который содержит более подробную информацию по этому вопросу.

+0

Я хотел знать, как я могу получить доступ к x (члену данных) объектом класса (obj) в функции friend. Но не мог сделать это в основном. Я предполагал, что объекты не могут получить доступ к частному члену напрямую только через функцию-член. – Echo

+0

Это просто. Это то, что вы получаете, когда объявляете функцию «другом» класса. Так как 'main' не объявлен« другом »класса, вы можете получить доступ только к переменным-членам' public' и функциям-членам класса в 'main'. –

+0

Таким образом, доступ к члену не имеет ничего общего с объектом класса. Я понятия не имею, как получить эти странные понятия. Огромное спасибо. – Echo

0

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

void print(){ 
    /**print or return your private variable here**/ 
}