構造函數的意義是初始化數據成員,可是不是應該用0或者確定的東西來初始化麼?

為什麼這裡會用n來初始化num,用nam來初始化name,還有用s來初始化sex?意義何在?既然初始化了還是個不確定的東西,為什麼要初始化,直接用name,sex,num就好了,何必多此一舉呀?

覺得很奇怪,求大佬解答一下,非常感謝╰(*′︶`*)╯


類用來產生對象。

同一個類可以產生許多不同的對象。

每個對象誕生(構造)時,有可能各不相同。

你,我,小明,蒼老師,都是人類。

是人類的四個對象。

當這四個對象出生,他們都哇哇地哭。

都有臉有鼻子有手有腳。

但也有不同。

比如我有帶把,小蒼老師沒有。

比如同樣帶把,我初始化時就有8cm。

而小明是0.8cm,你……醫生拿來了放大鏡,又無奈地丟棄,「快,實驗室拿顯微鏡……」

這一切不同來自誰?

當然是上帝,

上帝調用了人類一個擁有265個入參的構造函數。

那些入參它們有一個神祕的名字。叫基因。

總之,類往往需要有一種能力,讓調用者可在對象產生的時候就各不相同。

(本就應該如此嘛)

大千世界,萬事萬物的構造本就如此,所以c++的構造函數不一定將整數成員初始化為零,不一定將浮點數初始化為8.0 (0.8,0.000008以及0.0都有可能呀),這有什麼奇怪的嗎?

反過來才奇怪甚至恐慌的吧?!

每個中國人從醫生懷中抱過來,

都是一個模子……

然後,

「來,家長,選一下,我院最新6萬個初始化套餐可選,初始化醫生來自韓國和泰國……」

……

你之所以無法第一時間理解「構造函數入參之於新對象之差異化」的作用,

很大部分的原因,

是因為,

年輕人,你把參數都傳到了牆上,紙上。

你,還沒有真正地,構造過一個人。

若有一天,你立在產牀前,看著帥氣強壯的寶寶,你哆嗦地掏出顯微鏡遞給醫生,醫生微笑搖頭:「無需,肉眼可識別。」

驚喜欲狂,感謝上蒼!

彼時,你自然就懂得,構造一個對象時,為什麼要可以傳參數,又為什麼這些個參數要落實到新對象身上的各個成員。

……

所謂 ——

人情練達好代碼,世事洞悉通編程。

C++是世界上最入世的編程語言,恐怕沒有之一,在我有生之年。

想從根子上學自然而然,快快樂樂(偶爾要接受調侃)地學好c++,為什麼不買一本《白話C++》的上冊呢?

坦誠地說,你問的和我答的,都只是皮毛,以至於我為自己強答這麼長內容(明眼人看出是為了埋廣告)而害臊。

所以我覺得應該由簡單的問題,帶出點關鍵的知識。

來提出「類的不變式」,這幾乎是面向對象封裝的唯一重點。構造時初始化,除了是對象初始差異化的手段之一,更需要注意在對象創建時就滿足類的不變式。

在《白話C++》之練功(也就是上冊)的第666頁。


num等都是類成員變數。

初始化後就會記住這個值,以後用起來方便

而函數入口變數離開了函數後,類實體就不再與它有關係了。

你是希望類實體自己記住這些事,還是別人幫類實體記住這些事?

另外,從這個例子看,這本書是粗製濫造的垃圾書。


你要把一個類初始化成一個對象。比如說,現在有一個類,類名是人。你需要使用的時候需要把他進行實例化(構造函數),賦予他姓名、性別、出生日期等等屬性。他才成為了一個【實例】,成為了某一個存在的人,纔能夠被調用。

構造函數裏的參數就是用來賦值這些屬性的。你可以賦值給一個變數叫姓名、年齡……。但是無法知道這個變數是歸屬於誰的,誰的姓名都可以是姓名都可以name。

面向對象,就是把這些構成特殊體的屬性彙集到一起,形成了【類和對象】的概念。

另外一個問題是,類的定義和聲明的時候,類的對象還沒有產生。你需要在main裏調用到類的構造方法以後。才會有類的對象產生,所以,構造函數是傳的型參,你還不知道要給他起名叫什麼,只有等他出生了以後才起名,當然你也可以寫死他的屬性,比如構造函數裏寫死某個性別為男,那麼調用構造函數生產的對象,就全部都是男性了。


瀉藥。題主希望每次生成的學生編號都是0嗎?如果不是的話當然得用n啊,n,nam和s作為構造函數傳進來表示你在構造一個學生的時候就可以設定這個學生的編號,姓名,以及性別。

比如下面這段代碼會顯示學生1編號編號為7,學生2編號為14。如果用num = 0的話初始化的編號都只能是0了。

#include &

using namespace std;

class Student {
public:
Student(int n, string nam, char s) {
num = n;
name = nam;
sex = s;
}

int getNum() {
return num;
}

protected:
int num;
string name;
char sex;
};

int main() {
Student student1(7, "Liu", m);
cout & " & " &


這個構造函數就是全部參數都賦值了,你也可以設置默認值,你也可以寫無參構造函數,無參構造就像你說的你可以全部賦值0或者空,另外你這三個變數都是private,後續你是無法直接訪問的,你不賦值,那你就寫幾個函數去操作這幾個變數,或者改成public直接操作。

c++很自由,你想幹啥都行啊,你覺得這個構造函數不行,你可以隨便重載~stl初始化方法也不止一種。


你可能對函數的形參、實參還沒有懂。

比如我定義一個函數。

int fun1(int a){
int b = a;
int c = a + 2;
return b * c;
}

上邊的 a 在調用之前,代表幾始終是不確定的,所以就形參,只是一個形式。它的作用在調用它的時候才顯現出來。

int b = 3;
fun1(b); //這裡的 b 就叫做實參,實實在在的參數,有一個確定的值。
然後上邊的包含 a 的地方就可以按下邊的樣子理解
int fun1(3){
int b = 3;
int c = 3 + 2;
return b * c;
}

所以調用的時候它就是一個確定的數字了。

你說的構造函數 num = n

n 就是一個形參,調用它之前確實是一個不確定的數,但調用它的時候,它一定接受了一個實參,成為一個確定的數。


num,name,sex是Student類的成員變數,而n,nam,s是構造函數的形參。構造函數傳入不同的實參,得到的對象的num,name,sex就是不同的值。想讓得到對象的num為0就在構造函數裏傳入0,想讓得到對象的num為1就在構造函數裏穿入1。如果在構造函數裏寫num = 0,那麼調用這個構造函數得到的所有對象,它們的num都是0。


可能因為按代碼行數發工資?萬惡的資本家把屬性在構造函數裏賦值,這樣就少寫3行代碼。少發3行工資,美滋滋


推薦閱讀:
相關文章