函数如何访问类对象的私有数据成员

How does a function access private data member of a class object?

本文关键字:对象 数据成员 何访问 访问 函数      更新时间:2023-10-16

代码:-

#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声明改变了使用privateprotectedpublic访问说明符的默认访问规则。

声明为类的friend的函数可以访问该类所有实例的所有成员。

宋元尧的回答引用了标准中提供更多细节的部分

这个函数应该是公共的,这样你就可以通过main()来访问它。

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