函数如何访问类对象的私有数据成员
How does a function access private data member of a class object?
代码:-
#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;
}
我想知道如何通过friend函数中的对象访问PRIVATE数据类型,但不能在main中这样做。
当我读到访问说明符时。它指定private只能被成员函数访问(我对友元函数没有问题),而不能被该类的对象访问。我想知道,在一种情况下,我可以通过对象访问私有成员,而在另一种情况下,我不能这样做。这同样适用于复制构造函数。
友元函数就是这样做的:类的任何友元函数都可以访问它的私有成员。由于您的printPrivateMember
被声明为a
的朋友,因此它可以访问它的私有x
成员。因为main不是友元函数,所以它不能。
预示着一个关于宣布main
为友的问题,这个问题涵盖了它
因为朋友可以这么做。
$11/1 Member access control
(强调我的)
类的成员可以是(1.1) - private;也就是说,它的名字可以是仅由所属类的成员和友类使用宣称。
(1.2) -受保护;也就是说,它的名称只能由类声明它所在的类的成员和友元派生自这个类,并由它们的朋友派生(见11.4)。
(1.3) -公众的;也就是说,它的名字可以在任何地方使用而不需要访问限制。
正如您正确观察到的,只有成员函数(包括构造函数和析构函数)和friend
函数和类可以访问您的private
s。这就是friend
的目的:它们为封装机制提供了一个异常(而不是 std::exception
)。
现在你可能会想这是破坏了封装还是实际上稳定了封装
如果要访问private成员,最好使用public函数,如:
class a {
private:
int m;
public:
int getM() {
return m;
}
};
您使用的短语not by the object of the class让我认为您对访问规则不清楚。访问规则并不适用于对象,而是适用于谁可以访问对象的成员变量和成员函数。
类的成员变量可以在函数中访问——函数可以是类的成员函数、另一个类的成员函数或全局函数。
也可以在全局空间中访问,例如初始化全局变量。
类中的friend
声明改变了使用private
、protected
和public
访问说明符的默认访问规则。
声明为类的friend
的函数可以访问该类所有实例的所有成员。
宋元尧的回答引用了标准中提供更多细节的部分
这个函数应该是公共的,这样你就可以通过main()来访问它。
void print(){
/**print or return your private variable here**/
}
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 使用指针访问数组中的对象数据成员
- 访问数据成员(本身是对象)的数据成员,就好像它们是类成员一样
- 有没有办法在C++中循环访问对象的不同数据成员
- "Class1"类"Class2"对象作为私有数据成员。如何通过"Class 2"函数引用"Class1"对象?
- 如何使用数据成员填充派生类的对象到基类的指针数组中
- 如何在C++中使用类对象访问指针数据成员
- 如何高效更改向量中所有对象的成员数据?
- C++中的常量对象或私有/常量数据成员(变量)?
- 指向未由对象地址初始化的对象的指针如何将值分配给类的数据成员
- 通过向量中的对象的数据成员迭代
- 继承的类对象如何使用私有数据成员
- 我如何在参考上使用数据成员而不使用新关键字创建对象
- 从R中访问C 对象数据成员
- 静态数据成员是否在所有类对象之前初始化?
- 通过指向对象数据成员的指针更改该对象的值
- C .更改对象数据成员的数据成员
- 排序类对象数据成员从大到小
- 如何设置对象数据成员与这个c++与这个
- 按对象数据成员属性搜索对象的向量