2012-11-22 158 views
0

我目前正在Pearson印刷公司的「從C++早期對象開始」一書中討論第7章。C++公共和私有數據類型

我無法理解在這個類中聲明變量「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); } 
}; 

我不明白

​​

聲明的功能。

+1

如果您沒有setRadius,您如何設置半徑值? –

+0

因爲它是私人的。嘗試訪問它並改變它,而不是使用'setRadius',你會發現代碼不會被編譯。 –

+0

您首先需要了解函數參數.'setRadius'是一個函數,它接受一個名爲''''''''''''''''的類型爲'double'的參數。你難以理解函數參數是什麼? –

回答

0

該半徑是私人的。沒有這個功能,你將無法從課堂外設置半徑。爲了使該類有用,您很可能希望能夠創建Circle類型的對象並設置它們的半徑。因此,您需要某種類型的功能才能設置該半徑。

解決這個問題的最簡單也是最合理的方法是在類Circle內部提供一個公共成員函數。

這可以很容易地使用setter來完成,比如你所展示的。這使您可以設置並稍後更改半徑。

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

你也可以提供一個額外的參數的構造函數,以確保圈總是有它的半徑初始化爲用戶提供的值,或至少設置的radius的聲明中的缺省值(C + +11)。

+0

哦!我明白現在是什麼!我瞭解保持數據私密性的功能,但出於某種原因,我並不瞭解程序無法在不傳遞公共變量'r'中的數據的情況下訪問'radius'變量內的內存。 – Robert

+0

我在'radius = r;'語句遇到了問題。當我查看該語句時,我看到類似'someVariable = 4;'或'someVariable = anotherVariable;',我不知道如何將一個空變量傳遞給'radius'函數。謝謝你的解釋! – Robert

1

技術原因是「因爲半徑是私人的,因此無法從課堂外進入」。 所以更改半徑必須有一些如何像SetRadius公共成員函數管理。

如果現在的問題變成了「爲什麼設計師做了這樣的說法,並沒有簡單的化妝radius公衆?」,嗯...這是關於一個適當的面向對象的設計應該是這樣的東西有一個永無止境的辯論公開以及不在對象內部。

傳統的OOP學校傾向於將所有數據設置爲「私有」,並通過各種函數來訪問或修改它們,以實施他們稱之爲「封裝」的功能,並且在需要擴展接口以支持最終的回調或事件。

在這種瑣碎簡單的情況下,嗯......一切看起來像浪費能源(並且沒有正確的編譯器優化是浪費能源!在真正的物理意義)。但可能是他們需要一個統一的界面與其他東西。

0

公私任何人都無法訪問私有變量只類的方法,你只能訪問您的主要功能,使公共方法,功能setRadius負責設置半徑

的私有變量的概念
public: 
    void setRadius(double r) 
    { radius = r; } 

因爲半徑爲私有變量,所以你必須創建類中的公共職能來設置該變量,因此您可以在創建Circle對象通過設置半徑:

這將工作設置在主要的半徑

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

,但如果你想設置半徑直接:

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

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

1

隨着私人的功能行爲在其他的答案解釋,直接訪問課堂外的私人成員會給你一個編譯時錯誤。

如果您要求爲什麼我們使用setter函數,並使一些成員私有是一個設計問題。例如;如果你需要的半徑總是正數,你可以寫設置函數爲;

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

因此,你將有超過該部件的值的控制時,他們試圖類的外部進行修改。