0

我目前正在编写 Pearson 印刷公司的“从 C++ 早期对象开始”一书的第 7 章。

我无法理解此类声明中变量“r”的功能:

class Circle
{  private:
       double radius;

   public:
       void setRadius(double r)
       {  radius = r; }

  double getArea()
      {  return 3.14 * pow(radius, 2); }
};

为什么我不能像这样写“半径”变量?

class Circle
{  private:
       double radius;

  double getArea()
      {  return 3.14 * pow(radius, 2); }
};

我不明白的功能

   public:
       void setRadius(double r)
       {  radius = r; }

陈述。

4

4 回答 4

1

技术原因是“因为半径是私有的,因此无法从课堂外访问”。因此,对 radius 的更改必须以某种方式由公共成员函数(如SetRadius.

如果现在的问题变成“为什么设计师这样做,而不是简单地radius公开?”,那么……这是一场永无止境的辩论,关于正确的面向对象设计应该如何成为必须公开的内容以及什么不在对象内部。

传统的 OOP 学校倾向于使所有数据“私有”,并通过各种功能访问或修改它们以强制执行他们所谓的“封装”,并在需要扩展接口以支持最终回调或事件的情况下让生活更轻松。

在这个微不足道的简单案例中,嗯……一切看起来都是浪费能源(没有适当的编译器优化就是浪费能源!在真正的物理意义上)。但可能他们需要一个与其他东西的统一接口。

于 2012-11-22T07:32:46.813 回答
1

由于 private 的功能行为在其他答案中进行了解释,因此直接访问类外部的 private 成员会给你一个编译时错误。

如果您问我们为什么要使用 setter 函数并使某些成员私有化,这是设计问题。例如; 如果您需要半径始终为正数,则可以将 set 函数编写为;

void setRadius(double r)
{  
    if(radius >= 0)
        radius = r;
    else
        radius = 0;
}

因此,当试图在类外修改成员的值时,您将可以控制它们。

于 2012-11-22T07:47:25.800 回答
0

半径是私有的。如果没有该功能,您将无法从类外设置半径。为了使该类有用,您很可能希望能够创建 Circle 类型的对象并设置它们的半径。因此,您需要某种类型的函数来设置该半径。

解决这个问题的最简单和最合理的方法是在类 Circle 本身内提供一个公共成员函数。

这可以使用设置器最容易地完成,例如您所展示的。这允许您设置并在以后更改半径。

void SetRadius(float r)
{
    radius = r;
} 

您还可以为构造函数提供一个额外的参数,以确保 Circle 始终使用用户提供的值初始化其半径,或者至少在radius(在 C++11 中)的声明中设置默认值。

于 2012-11-22T07:27:03.677 回答
0

公有私有的概念,没有人可以访问私有变量,只能访问类方法,并且您只能从主函数访问公共方法,因此,函数 setRadius 负责设置半径的私有变量

public:
   void setRadius(double r)
   {  radius = r; }  

因为半径是一个私有变量,所以你必须在类中创建一个公共函数来设置该变量,这样你就可以在创建 Circle 对象时通过以下方式设置半径:

这将用于设置主要的半径

Circle * test = new Circle;
test.setRadius(7);  

但是如果您尝试通过以下方式直接设置半径:

Circle * test = new Circle;
test.radius = 7;

它将使程序崩溃无法访问类私有方法

于 2012-11-22T07:41:25.187 回答