簡體   English   中英

C ++公共和私有數據類型

[英]C++ public and private datatypes

我目前正在研究Pearson印刷公司“從C ++早期對象開始”一書中的第7章。

我無法理解變量'r'在此類聲明中的功能:

class Circle
{  private:
       double radius;

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

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

為什么我不能像這樣寫'radius'變量?

class Circle
{  private:
       double radius;

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

我不明白的功能

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

聲明。

技術原因是“因為半徑是私人的,因此無法從課堂外進入”。 因此,對半徑的更改必須是由SetRadius等公共成員函數管理的。

如果現在的問題變成“為什么設計師這樣做了,並沒有簡單地公開radius ?”,那么......這是一個永無止境的辯論,關於如何正確的面向對象設計應該是一個必須公開和什么不在一個對象內。

傳統的OOP學校傾向於使所有數據“私有”並通過各種功能訪問或修改它們以強制執行他們所謂的“封裝”,並且在界面需要擴展以支持最終回調或事件的情況下使生活更輕松。

在這個簡單的簡單案例中,嗯......所有看起來都是浪費能源(沒有適當的編譯器優化是浪費能源!在真正的物理意義上)。 但也許他們需要與其他東西建立統一的界面。

由於private的功能行為在其他答案中得到解釋,因此直接訪問類外的私有成員會給出編譯時錯誤。

如果你問為什么我們使用setter函數並使一些成員私有是一個設計問題。 例如; 如果您需要半徑始終為正數,則可以將set函數寫為;

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

因此,當嘗試在類外部修改成員時,您將可以控制成員的值。

半徑是私人的。 如果沒有該功能,您將無法從類外部設置半徑。 為了使類有用,您很可能希望能夠創建Circle類型的對象並設置它們的半徑。 因此,您需要某種類型的函數來設置該半徑。

解決此問題的最簡單,最合理的方法是在Circle類中提供公共成員函數。

這可以通過使用setter完成,例如您所顯示的內容。 這允許您設置並稍后更改半徑。

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

您還可以為構造函數提供額外的參數,以確保Circle始終使用用戶提供的值初始化其半徑,或者至少在radius聲明中設置默認值(在C ++ 11中)。

公共私有的概念,沒有人可以只訪問類方法的私有變量,而你只能從你的main函數訪問公共方法,所以函數setRadius負責設置半徑的私有變量

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

因為radius是一個私有變量所以你必須在類中創建一個公共函數來設置該變量,這樣你就可以在創建Circle對象時設置半徑:

這將在main中設置半徑

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

但如果您嘗試直接設置半徑:

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

它會崩潰程序無法訪問類私有方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM