目錄
kajandwt建構函式 是乙個 特殊的成員函式,名字與類名相同 , 建立類型別物件時由編譯器自動呼叫 ,保證每個資料成員都有 乙個合適的初始值,並且 在物件的生命週期內只呼叫一次 。 其實建構函式的作用就是完成成員變數的初始化 ,但不同於c語言的初始化建構函式可以實在創造物件的同時就完成成員變數的初始化。
1. 函式名與類名相同。
2. 無返回值。
3. 物件例項化時編譯器 自動呼叫 對應的建構函式。
4. 建構函式可以過載。
建構函式的實現主要有三種,
1.當使用者沒有實現建構函式的話系統會預設創造乙個,此時系統會將內建型別的成員變數賦予隨機值,而對於自定義型別的成員變數則會呼叫他們的建構函式。(注:內建型別一般指的是:int char double float等這些定義好的型別,自定義型別指的是:struct這種型別以及class類這種)。
2.當然使用者也可以自己實現建構函式,一種為無參構造
3.類一種為帶參構造,但是在帶參構造中我們使用全預設構造。我們用**展示一下:
3.1.系統預設的建構函式
我們可以看到當我們沒有在data類進行函式構造的時系統將會自己預設建立建構函式,對內建型別變數賦予隨機值,自定義型別呼叫自己的建構函式(若自定義型別也沒有定義建構函式那麼此例子中的_a1和_a2也會被賦予隨機值)
3.2無參構造
3.3 帶參構造
這裡出乙個問題對於**風格造成的問題:成員變數year最後的結果是多少呢?
class aprivate:int year;};int main()答案是:隨機值。那麼為什麼是隨機值呢?這裡主要是變數之間它採用了就近原則,所以等式左邊的year會直接尋找離他最近的變數所以會將等式右邊的year直接賦值給它自己,所以year最後的值就是隨機值。
我們繼續來說帶參的建構函式,我們一般推薦使用的是全預設的建構函式(注:
無參的建構函式和全預設的建構函式都稱為預設建構函式,並且預設建構函式只能有乙個。無參建構函式、全預設建構函式、我們沒寫編譯器預設生成的建構函式,三者都可以認為是預設成員函式。
建構函式時完成物件的初始化,那麼乙個物件又是怎麼樣被銷毀的呢?
與建構函式功能相反,析構函式不是完成物件的銷毀,區域性物件銷毀工作是由編譯器完成的。而 物件在銷毀時會自動呼叫析構函式,完成類的一些清理工作。
1. 析構函式名是在類名前加上字元 ~ 。
2. 無引數無返回值。
3. 乙個類有且只有乙個析構函式。若未顯式定義,系統會自動生成預設的析構函式 。
4. 物件生命週期結束時, c++ 編譯系統系統自動呼叫析構函式。
這裡我們用棧的例子來說明析構函式的實現以及作用。
class stack
_top = 0;
_capacity = capacity;
www.cppcns.com }
//析構函式的實現
~stack()
private:
int* _a;
int _top;
int _capacity;
};這裡是完成建構函式,有自己定義的析構函式的效果。同建構函式一樣對於內建成員變數析構函式會置為隨機值,而自定義型別則會去呼叫他們的析構函式。
如果某些時候我們需要去複製乙個物件,這樣的話我們該怎麼樣去解決呢?
這裡我們就需要引入拷貝函式。那麼什麼叫做拷貝函式呢?我們應該去怎麼實現呢?有什麼注意事項呢?這裡我們一一來說道。
建構函式 : 只有單個形參 ,該形參是對本 類型別物件的引用 ( 一般常用 const 修飾 ) ,在用 已存在的類型別物件 建立新物件時由編譯器自動呼叫 。
1. 拷貝建構函式 是建構函式的乙個過載形式 。
2. 拷貝建構函式的引數只有乙個且必須使用引用傳參,使用傳值方式會引發無窮遞迴呼叫 。
3. 若未顯示定義,系統生成預設的拷貝建構函式。 預設的拷貝建構函式物件按記憶體儲存按位元組序完成拷 貝,這種拷貝我們叫做淺拷貝,或者值拷貝。
拷貝函式的實現分為兩種一種是系統預設,一種是自己定義。我們分別來看其效果
class a
~a()
private:
int _a1;
int _a2;
}; class data
*/ //kajandwtdata(int year, int month, int day)
// data(int year = 2022,
int month = 12,
int day = 12)
private:
int _year;
int _month;
int _day;
a a;
}; int main()
呼叫系統預設生成拷貝函式(注:這裡拷貝函式的拷貝對自定義型別和內建型別的成員變數處理都是一致的完成位元組序的值拷貝)
圖1 呼叫系統預設生成的拷貝函式
圖2 呼叫使用者自己定義的拷貝函式
在這裡我們順便說一下在自定義拷貝函式的時候一定要使用引用不然會出現無限遞迴例如 data(data s){}正確的使用是data (const data & s){}其中const是為了保護原資料不被輕易改動。
class a
~a()
private:
int _a1;
int _a2;
}; class data
*/ //data(int year, int month, int day)
// data( const data &s)
data(int year = 2023,
int month = 12,
程式設計客棧 int day = 12)
private:
int _year;
int _month;
int _day;
a a;
}; int main()
我們可以發現s2均完整的賦值了s的內容,但是這裡真的就沒有問題了嗎?如果我們使用系統預設生成的拷貝函式成員變數中含有指標那麼會出現什麼樣的問題呢?
class string
~string()
private:
char* _str;
};int main()
我們可以看到雖然雖然s1拷貝了s的內容但是最後系統還是丟擲了錯誤那麼這個錯誤來自那裡呢?
我們看這幅圖
這裡就是我們之前說的系統預設生成的拷貝函式是淺拷貝,那麼怎麼去完成深拷貝我們後邊在繼續講解。
本文標題: 詳解c++之類和物件
本文位址: /ruanjian/c/436834.html
C 之類和物件
物件 物件是特指的某乙個具體實物,比如 桌子 就不是物件,而 這張桌子 就是物件 屬性 每個物件的每個屬性都是有特定的值得。屬性 性別,名字 方法 物件的行為,動作,執行的操作。方法 吃飯,睡覺 類的定義 類是抽象的概念,僅僅是模板,比如說 人類 訪問修飾符 class 類名 成員 public c...
C 之類和物件
給大家講解下我學習c 的經驗 那就是不要看太多理論之後再去實踐,有人覺得不懂不就應該先看會才行嗎,不不不,程式設計是門實踐課,曾經我的導師跟我說這的知識你在書本上是看不會的,當你動手操作才能學會,我實際學起來才發現導師說的非常對。出錯了,按照錯誤去學習,該怎麼寫比直接看定義好太多太多 當然不是不讓你...
C 入門之類和物件
類和物件的簡單使用 1.練習1 設計乙個圓形類 circle 和乙個點類 point 計算點和圓的關係。分析 1.圓類。圓由圓心和半徑決定。2.圓和點的關係 點在圓外,點在圓上,點在圓內。author cloud include include include using namespace std...