【问题标题】:What does it mean to be a private member (c++ classes)?成为私有成员(c++ 类)意味着什么?
【发布时间】:2018-02-23 02:15:31
【问题描述】:

我对 C++ 类中的私有数据成员有点困惑。我是编码新手,仍然处于我的“类”章节的中间,所以我可能领先于自己,但我觉得我错过了一条信息:

假设我有这个代码:

class clocktype;
{ 
  public:
          void setTime(int,int,int);
          .
          .
          .
   private:
          int hr;
          int min;
          int sec;
     };

然后我创建了一个对象 myclock。

clocktype myclock;
myclock::setTime(hour,minute,min)
{
  if (0<= hour && hour < 24)
  hr = hour;

  if (0<= minute && minute <60)
  min = minute;

  if ( 0<= second && second<60)
  sec = second;
 }
 myclock.setTime(5,24,54);

我的教科书说我不能这样做:

myclock.hr = 5;

因为hr 是私有数据成员,而对象myclock 只能访问公共成员。但这实际上不是我在setTime 函数中所做的吗?我知道我正在通过我的公共成员函数访问myclock.hr。但我仍在为这背后的逻辑而苦苦挣扎。那么,成为私有数据成员意味着什么?

【问题讨论】:

  • 这是一个访问级别的类比,它应该可以帮助你cseducators.stackexchange.com/a/1246
  • here 和所有优秀的 c++ 教科书都回答了您的问题。
  • 请注意,myclock.hr = 5 可以让您将hr 设置为任何值。您的 setTime 函数对您可以设置的值进行了限制。它维持着invariant
  • 在你的书中多读一点。 :-)
  • @BoPersson 是的,当我阅读更多内容时,它开始变得更有意义:) 但是我从这里得到的一些答案帮助我在教科书中给出的简单示例之外进行了可视化。

标签: c++ private members


【解决方案1】:

这里的主要思想是encapsulation。区分私有数据成员和公共 setter 方法将允许您更改 clocktype 类的实现,并且不需要使用它的每个人重新编译他们的代码。假设,为了争论,您决定更改clocktype 实现以存储从一天开始的秒数。您需要做的就是重新实现setTime 方法,并且您不必触摸公共接口:

class clocktype;
{ 
    public:
        void setTime(int,int,int);
    private:
        int secFromMidnight;
};

clocktype myclock;
myclock::setTime(hour, minute, second)
{
    secFromMinight = second + (minute * 60) + (hour * 24 * 60);
}

【讨论】:

    【解决方案2】:

    在编程语言中编写函数或类(元素/符号)时需要做两件事:

    1. 如何使用元素,这被称为接口,这是向使用它的程序员公开的内容
    2. 元素的作用,这称为实现,不一定暴露出来,可以改变,因为它通常会出现问题,可以随着时间的推移而开发(理想情况下)

    这个想法很简单,接口,类似于您的函数setTime(),可以在类中执行多项操作。设置时间在未来可能需要更多的调用或更复杂的事情,除了改变一些变量,或者对于其他操作系统可能不同。现在对于您的班级的用户,他收到了带有错误修复的新版本的库,这不会有什么不同,因为他仍然使用相同的参数调用相同的函数,而对他来说唯一的区别是 该功能的作用是固定的。因此,他不必重新编写代码以适应您的新修复,并且您阻止他使用您的类的变量,因为这不是您在设计中计划的。你计划让他专门使用setTime()

    所以,基本上,它只是交换库的程序员内部的东西。这只是一种编写代码的干净方式。最终,对于程序运行时的最终结果,是否一切都是公开的并没有关系。换句话说:这是编程游戏,我们按照自己创建的规则进行游戏,以确保代码整洁和长期稳定性。

    【讨论】:

      【解决方案3】:

      默认情况下,C++ 中的类成员是私有的,这意味着您不能通过任何外部对象(在 main 中)访问它们。如果你在你的类中定义[不仅仅是声明] setTime 函数,它是私有成员的友元函数,你也可以在 main 中使用一个对象来初始化你的私有成员。

      class clocktype;
      { 
       private:
                int hr;
                int min;
                int sec;
      
        public:
                void setTime(int hour,int minute,int min)
       {
        if (0<= hour && hour < 24)
        hr = hour;
      
        if (0<= minute && minute <60)
        min = minute;
      
        if ( 0<= second && second<60)
        sec = second;
        }
       };
      

      只需声明一个对象(在 main 中)并调用 setTime 即可。

      【讨论】:

        【解决方案4】:

        setTime 是类时钟类型的一部分,因此它可以访问私有成员。

        私有通常意味着,它对类是私有的 - 这意味着只有类中的成员才能访问它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-07-31
          • 2012-07-06
          • 1970-01-01
          • 1970-01-01
          • 2021-12-11
          • 2013-01-16
          • 2019-12-29
          • 2021-08-29
          相关资源
          最近更新 更多