我对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
。但我仍然在努力应对背后的逻辑。那么成为私人数据成员意味着什么?
答案 0 :(得分:2)
这里的主要想法是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);
}
答案 1 :(得分:1)
setTime是Class clocktype的一部分,因此它可以访问私有成员。
私人通常意味着,它是私人的 - 意味着,只有班级中的成员才能访问它。
答案 2 :(得分:1)
默认情况下,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即可。
答案 3 :(得分:1)
在编程语言中编写函数或类(元素/符号)时,有两件事要做:
这个想法很简单,界面就像你的函数setTime()
一样,可以在类中做多个事情。除了改变一些变量之外,设置时间在未来可能需要更多的调用或更复杂的事情,或者对于其他操作系统可能不同。现在,对于收到了新版本库并修复了错误的类的用户来说,它不会有所作为,因为他仍然使用相同的参数调用相同的函数,并且唯一的区别对他来说,该功能的作用是什么是固定的。因此,他不必修改他的代码以适应您的新修复,并且您阻止他使用您班级的变量,因为这不是您在设计中的计划。您计划让他专门使用setTime()
。
所以,基本上,它只是交换库的程序员内部的东西。它只是编写代码的一种简洁方式。最终,对于程序运行的最终结果,一切都是公开的并不会产生影响。换句话说:它是编程游戏,我们遵循我们创建的规则,以保证代码清晰和长期稳定。