私有成员是什么意思 (c++ 类)?

What does it mean to be a private member (c++ classes)?

我对 C++ 中的私有数据成员有点困惑 类。我是编码的新手,还处于 'Classes' 章节的中间,所以我可能超前了,但我觉得我错过了一条信息:

假设我有这个代码:

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 只能访问 public 成员。但这实际上不是我在 setTime 函数中所做的吗?我知道我正在通过我的 public 成员函数访问 myclock.hr。但我仍在为这背后的逻辑而苦苦挣扎。那么成为私有数据成员意味着什么呢?

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

私有通常意味着,它对 class 是私有的 - 这意味着只有 class 中的成员可以访问它。

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

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);
}

Class C++ 中的成员默认是私有的,这意味着您不能通过任何外部对象(在 main 中)访问它们。如果您在 class 中定义 [不只是声明] 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 即可。

用编程语言编写函数或 class(element/symbol)时有两件事要做:

  1. 如何使用元素,这称为接口,这是向使用它的程序员公开的内容
  2. 元素做什么,这叫做实现,不一定暴露,可以改变,因为一般都会有问题,可以随着时间发展(理想情况下)

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

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