我的代码: -
#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只能通过成员函数访问(我对友元函数没有问题),而不是该类的对象。我想知道有什么区别因为我可以在一个案例中通过一个对象访问私有成员而在另一个案例中不能这样做。这同样适用于复制构造函数。
答案 0 :(得分:1)
这正是朋友的功能所做的:一个班级的任何朋友功能都可以访问它的私人会员。由于您printPrivateMember
被宣布为a
的朋友,因此它可以访问其私人x
成员。由于main不是友方功能,因此无法实现。
预测关于将main
声明为好友的问题,this question涵盖了该问题。
答案 1 :(得分:1)
因为朋友可以这样做。
$11/1 Member access control [class.access]
(强调我的)
1班级成员可以
(1.1) - 私人;也就是说,它的名字可以 仅由成员和类的朋友使用 声明。
(1.2) - 受保护;也就是说,它的名称只能用于 按类别声明它的类的成员和朋友 来自该班级,以及他们的朋友(见11.4) (1.3) - 上市;也就是说,它的名称可以在任何地方使用而无需访问 限制。
答案 2 :(得分:0)
正如您所正确观察到的,只有成员函数(包括构造函数和析构函数)和friend
函数和类可以访问您private
。这就是friend
的目的:它们为封装机制提供了一个例外(不 std::exception
)。
现在你可以考虑这是否会打破封装或实际稳定它。
答案 3 :(得分:0)
如果您想访问私人会员,您最好使用以下公共功能:
class a {
private:
int m;
public:
int getM() {
return m;
}
};
答案 4 :(得分:0)
您使用短语而不是该类对象让我觉得您不清楚访问规则。访问规则不适用于对象,但可以访问对象的成员变量和成员函数。
可以在函数中访问类的成员变量 - 该函数可以是类的成员函数,另一个类的成员函数或全局函数。
它也可以在全球空间中访问,例如初始化全局变量。
类中的friend
声明会使用private
,protected
和public
访问说明符更改默认的访问规则。
声明类的friend
的函数可以访问该类的所有实例的所有成员。
answer by songyuanyao引用标准中提供有关该主题的更多详细信息的部分。
答案 5 :(得分:0)
此功能应该是公共的,以便您可以通过main()访问它。
void print(){
/**print or return your private variable here**/
}