C 類當中為什麼要有private?

時間 2021-05-29 22:56:37

1樓:麻辣牛肉

為什麼要有C++?到了彙編全都是記憶體位址,暫存器和運算,C不就很好了嗎?還是說直接彙編就ok了?什麼虛函式,引用,const,統統不過是語法糖罷了,到了彙編,還不是乙個樣

2樓:Ronaldo

因為private就是要在編譯期間限制你這個類成員只能這個類自己用,其他類別用,也別操心。用了就給你報錯。這樣一來,別人要用這個類就只關心開放的介面就行了。

就像電器一樣,傻瓜式操作和維護,誰不喜歡啊?這就是封裝的好處啊!

3樓:zr scat

其實是可有可無的,

有很多其他方法可以隱藏實現,

只是c++覺得這個特性很重要,可能吧,乙個語言有乙個語言的特色我們需要做到的是利用它並且駕馭它

4樓:暮無井見鈴

這是一種零開銷的編譯時檢查機制。

全盤 public ,通過額外約定保證安全訪問,固然能在一定場合帶來便利;但這樣同時也捨棄了語言保證的編譯時檢查機制。

(不過如果能保證有其他自動檢查的話,全盤 public 未嘗不可)pImpl 對於封裝的目的更好,而且有助於保持 ABI 穩定和加快編譯。但它畢竟多了一層間接,同時增加了構造/析構物件的開銷。

5樓:大鈾子

比如乙個大整數類:

class

BigInt

這個類的加號和減號已被過載,使用者可以呼叫。在加減號呼叫時,會根據引數選擇執行加法或減法(此時呼叫私有函式sub),sub函式只在兩個數同號,且|*this| >= |b|時執行正常,而在其他時候可能會發生越界訪問、丟擲異常或死迴圈等錯誤。該函式的加減號過載時保證了傳入sub的引數是正確的,所以不會發生錯誤。

為了防止使用者錯誤使用這個sub函式,應該將其設為private私有函式,告訴使用者直接呼叫加減運算子即可。

6樓:

拋開實際談理論都是很難理解的,類是為設計模式而存在的,就拿單例模式(懶載入)來說,怎麼控制唯一例項?

最根本的就是禁止無限制的使用建構函式,即把類自身的建構函式的訪問許可權設定為private。

在類的內部設計乙個靜態public方法(即getInstance),該方法會檢查靜態例項是否初始化完成,外部訪問getInstance方法時,只能獲得第一次例項化的物件。

如果沒有private約束,很難防止外界去濫用建構函式。

7樓:甄志丙

防止菜鳥亂用。我辛辛苦苦寫的singleton,你不調Getinstance(),非要自己new乙個,完了還不delete。我真的會打死你哦。

8樓:Godbird

比如一台電視機:

public就是遙控器,以及電視上的那些按鍵private就是電視裡面的顯示電路,裡面的電容等等public給外部使用者

private給內部使用者

9樓:Bird Frank

將程式分解為由高度內聚的資料和方法組成的模組是將複雜問題(功能)分解、分而治之的基本方法。

將模組分為隱藏的內部狀態和對外可見的呼叫介面是管理模組依賴關係的重要基礎。

(順便插一句,封裝並不是OOP引入的新特性。)

在C語言時代我們可以將公開介面定義在標頭檔案中,將儲存內部狀態的變數以及內部使用的函式定義在.C檔案中,此時不需要private。

到C++,內部外部、外部介面函式統統變成了類的成員變數、成員方法。由於編譯器需要知道類的內部結構,比如在計算物件大小時,因此這些成員變數、成員方法就都要寫到頭檔案裡。而為了保持封裝性,就必須加上private等訪問條件的限定。

因此private可以看成是為滿足封裝需求對編譯器的妥協。

對於類的使用者來說,private的意思就是:「這是給編譯器看的,不是給你看的。」

如果對於「為什麼模組需要區分內部狀態和外部介面」這點有疑問,請另外開題。

10樓:Xi Yang

就是簡單地防止自己或者別人手賤而已。真的想隱藏好,需要把實際內容也藏起來,徹底阻止手賤慾望的產生。

C語言(GNU的很多庫都是這樣的):

/* 在標頭檔案裡 */

typedef struct _MyClass MyClass;

MyClass* my_class_new();

void my_class_ref(MyClass* self);

void my_class_unref(MyClass* self);

void my_class_method1(MyClass* self, float param1, int param2);

void my_class_method2(MyClass* self, double param1, char param2);

/* 在實現檔案裡 */

struct _MyClass ;

各個函式的定義。。。。。。

C++的對等寫法(Qt很多部分是這樣的):

// 在標頭檔案裡

class MyClass

;// 在實現檔案裡

struct MyClass::Guts

各個函式的實現。。。。。。

11樓:

我認為有多型和繼承,是可以不用private的,既然private是不讓人訪問,就乾脆不讓人感知到,比如COM介面,只有介面申明,有什麼資料成員,內部如何使用完全不需要關注。

12樓:

你確切知道這個屬性外部不需要使用,只提供給內部用的時候,private就有用了。一是為了讓呼叫方看著簡潔,二是既然引數只在內部有用,外部不小心修改了肯定是無效(無意義)操作,除了浪費時間執行這些無意義指令,甚至可能因引數改變而導致這個類的函式行為改變。

13樓:

為什麼有Private和Public之分,這不是個技術問題,更不是C++技術問題,而是乙個工程化和業務問題,什麼東西不願讓外部看見,什麼東西希望讓外部知道。

只是OOP的設計思路,充分考慮到工程管理和業務場景的需求了而已。

14樓:不一樂乎

物件導向有兩種使用者,一種是類的設計者,一種是類的實用者。如果是前者,你自然會有把部分方法設定為私有的能力,這個能力就跟你會寫個函式一樣;如果是後者,那就忘記什麼物件導向吧,當C語言一樣用也沒啥問題。

15樓:大雄

編譯期檢測》執行時檢測》不檢測。

private是為了編譯期檢測。

沒做執行時檢測是另乙個問題,是為了效能而省略了這個事兒,讓程式設計師自己避免。

16樓:原子筆

君子協定,在不使用pimpl模式的情況下(物理封裝),命名也沒有加什麼internal字首或者impl字尾(警示語封裝),提醒使用者不要去使用這些成員(編譯封裝)。

擋不住使用者#define private public 或者通過指標偏移的方法訪問哈。

17樓:Milo Yip

物件導向程式設計語言一般具三大特徵:封裝(encapsulation)、繼承(inheritance)、多型(polymorphism)。

C++ 的 private 用於封裝,限制成員變數及函式的可見性。

許多語言功能都是用於在編譯期加諸限制,避免誤用,也便於長期維護。

18樓:shenqi lin

這個作用還是比較多的,比如有的類想限定別的類進行訪問,那麼就是把建構函式設為private,然後把可以訪問她的類申明為friend。

19樓:wolfand11

程式設計中用到的兩個方法是組合和抽象。組合的方法讓程式設計師可以使用已有的元素組合出來更加複雜的元素。為了使組合出來的複雜元素使用方便,可以使用抽象的方法把複雜元素抽象為乙個元素。

類其實就是通過已有元素組合出來的複雜元素,一方面:為了讓類的使用者方便使用,我們將類介面的訪問許可權設定為public,將類內部實現部分的訪問許可權設定為private,這樣使用者就不需要了解private部分了,他只需要了解public部分。另一方面:

為了讓類這個實體更加健壯,我們不暴露該實體的內部。就像我們人類一樣,我們不會把自己的心臟、胃、大腦暴露給別人吧?

20樓:

private是物件導向裡很重要的部分啊!

這樣可以封裝乙個類,你不需要知道內部的原理,你也不能干涉內部的東西,你只需要使用public的介面便可以。

就像買來乙個手機,你不需要知道它是如何編碼和傳送無線電波的,你只需要知道怎麼用它就行。

如果private暴漏出來就好像把怎樣編碼啊,怎樣和基站通訊啊混同正常的使用方式這些都放你面前讓你來選擇如何去使用這個手機,那得多麻煩。

21樓:Eastenluis

我想private的存在能幫助解釋類的屬性和邏輯,並讓編譯器幫你維護這個邏輯。

比如我們有個類叫汪星人,它有個方法叫「消化」。假設,消化是汪星人身體自動進行的事件,我們沒法命令它或迫使它(也就是,外部物件不能呼叫「消化」),我們就把「消化」設為private,以表現這個邏輯。所以,如果主人想直接呼叫汪星人的」消化「,編譯器就會報錯,因為這不符合我們的一般邏輯。

相反,如果」消化「是被「汪星人」的「進食」方法所呼叫,就能順利通過編譯器的檢查。

這樣就能讓編譯器幫助我們檢查各段編碼邏輯的一致性,既提醒自己,也能方便他人理解。

一談程式設計我都不會中文了。。。類和方法怎麼念怎麼彆扭。。。

22樓:

說對了,就是為了讓編譯器檢查出來。

靜態語言的設計思路,很多時候就是為了讓編譯器盡可能多的檢查出錯誤。

private 也是一樣。

考慮一下,變數名本身也是只在編譯階段有意義的。

C 中為什麼要有allocator類?

Wu Jarvis 我是這麼理解的 其實你只要分清vector中resize,reserve的關係就能明白了,resize時,當元素數量 capacity時不但會分配空間,而且會初始化元素 reserve只會做分配空間的事情,不會做初始化,這樣就把分配空間和初始化的事情分開來了,如果不分開的話,那麼...

C 為什麼Random類不做靜態?

程子昂 這保證每個Random例項都是乙個固定的偽隨機數生成器 PRNG 也就是說兩個Random例項如果用同乙個隨機數種子的話生成的隨機數序列是一樣的 預設的種子是系統時間 這個性質在某些地方會很有用,譬如密碼學裡的對稱流加密就可以用PRNG實現 總這個角度講Random其實也不太安全,RNGCy...

Java為什麼要有反射機制,而 C 沒有?

這個語言一開始不是精心設計的,只是為了給C打補丁,後來也是持續的打補丁。語言沒有被一家控制,各個編譯器廠商為所欲為的自己擴充套件語法,想改動點什麼很難。反射是好事,各個編譯器都能輸出符號表,debug工具都支援反射,難度不在於實現,而在於撕逼。 Home RTTR 乙個C 的反射庫,沒用過不知道是否...