【问题标题】:How does a function access private data member of a class object?函数如何访问类对象的私有数据成员?
【发布时间】:2016-01-20 02:12:37
【问题描述】:

我的代码:-

#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 中无法访问。

当我读到访问说明符时。指定只能由成员函数(我对朋友函数没有问题)访问私有,而不能由该类的对象访问。我想知道有什么区别,因为在一种情况下我可以通过对象访问私有成员,而在另一种情况下不能这样做。这同样适用于复制构造函数。

【问题讨论】:

  • 你可以使用朋友功能的概念。

标签: c++ private friend access-specifier friend-function


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    因为朋友可以这样做。

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

    (强调我的)

    1 一个类的成员可以是

    (1.1) — 私有的;也就是说,它的名字可以是 仅由其所在班级的成员和朋友使用 声明。
    (1.2)——受保护;也就是说,它的名字只能被 声明它的类的成员和朋友,按类 派生自该类和他们的朋友(见 11.4)。
    (1.3)—— 民众;也就是说,它的名字可以在任何地方使用而无需访问 限制。

    【讨论】:

      【解决方案3】:

      您使用短语不是由该类的对象让我认为您不清楚访问规则。访问规则不适用于对象,但谁可以访问对象的成员变量和成员函数。

      一个类的成员变量可以在一个函数中被访问——它可以是该类的一个成员函数,另一个类的一个成员函数,或者一个全局函数。

      它也可以在全局空间中访问,例如初始化一个全局变量。

      类中的friend 声明会更改使用privateprotectedpublic 访问说明符的默认访问规则。

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

      answer by songyuanyao 引用了标准中提供有关该主题的更多详细信息的部分。

      【讨论】:

      • 我想知道如何通过朋友函数中类(obj)的对象访问x(数据成员)。但主要不能这样做。我的假设是对象不能仅通过成员函数直接访问私有成员。
      • 这很简单。这就是当您将函数声明为类的friend 时得到的。由于main没有声明为类的friend,所以只能在main中访问类的public成员变量和成员函数。
      • 所以成员访问与类的对象无关。我不知道如何得到这个奇怪的概念。非常感谢。
      【解决方案4】:

      如果你想访问私有成员,你最好使用公共函数,例如:

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

      【讨论】:

        【解决方案5】:

        这正是友元函数的作用:类的任何友元函数都可以访问它的私有成员。由于您的printPrivateMember 被声明为a 的朋友,它可以访问它的私有x 成员。由于 main 不是友元函数,所以不能。

        预先解决关于将main 声明为朋友的问题,this question 涵盖了它。

        【讨论】:

        • 我想知道我们如何通过类的对象访问私有成员。我们不需要成员函数来访问它们吗?
        • @SudeshnaBora,不,如果它们是公开的,您可以从任何地方直接访问它们,也可以从朋友函数或朋友类访问它们,即使这些成员不公开。
        • @SudeshnaBora 是的,您需要一个成员函数 friend。但这只是您在示例程序中观察到的行为。
        【解决方案6】:

        正如您正确观察到的,只有成员函数(包括构造函数和析构函数)和friend 函数和类可以访问您的privates。这就是friends 的目的:它们为封装机制提供了一个例外(not std::exception)。

        现在您可能会考虑这是否会破坏封装或实际上稳定它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-04-01
          • 1970-01-01
          • 2013-12-30
          • 1970-01-01
          • 1970-01-01
          • 2011-07-27
          • 2017-04-04
          • 1970-01-01
          相关资源
          最近更新 更多