C 類的預設成員函式

2021-08-31 07:04:42 字數 3208 閱讀 7543

class test

這些函式只有在需要的時候才會產生,空類占用1個位元組。

類為了保護資料成員,其所有資料成員都預設是私有的(private),這也就意味著程式只能通過類裡面的函式提供介面來訪問資料成員。例如,下面程式用日期類建立了乙個物件,並進行初始化

class date

;int main()

為了解決這個問題 ,c++提供了一種特殊的成員函式~建構函式。建構函式沒有型別宣告(即無返回值),其函式名和類名相同,我們可以為建構函式提供一些方法完成我們我們想要的功能。例如:

class date

private:

int _year; //為了和非成員引數區分,一般類成員引數以m_或者_開頭

int _month;

int _day;

};int main()

使用引數列表對資料成員進行初始化:c++還提供了一種初始化資料成員的方式~初始化列表。初始化列表以冒號開頭,後跟一系列以逗號分隔的初始化字段。例如:

class date

private:

int _year; 

int _month;

int _day;

建構函式的執行可以分成兩個階段,初始化階段和計算階段,初始化階段先於計算階段。

初始化階段:所有類型別的成員都會在初始化階段初始化,即使該成員沒有出現在建構函式的初始化列表中。 

計算階段:一般用於執行建構函式體內的複製運算。

注意:每個成員在初始化列表中只能出現一次。

初始化列表僅用於初始化類的資料成員,並不指定這些資料成員的初始化順序,資料成員在類中定義順序就是在引數列表中的初始化順序。

盡量避免使用成員初始化成員,成員的初始化順序最好和成員的定義順序保持一致,對於類型別來說,使用初始化列表少了一次呼叫預設建構函式的過程。

下面這些必須放在初始化列表中:

常量成員,因為常量只能初始化不能賦值。

引用型別,因為引用必須在定義的時候初始化,並且不能重新賦值。

沒有預設建構函式的類型別,因為使用初始化列表可以不必呼叫預設建構函式來初始化,而是直接呼叫拷貝建構函式初始化。

【預設建構函式】 

類如果沒有顯式定義建構函式時,編譯器會合成乙個預設的建構函式,該建構函式中什麼工作都不做。但是只要顯式定義了,即使該建構函式什麼也不做,編譯器也不會為該類合成預設的建構函式。編譯器生成的預設建構函式使用與成員變數初始化相同的規則來初始化成員,具有類型別的成員通過執行各自的預設建構函式來進行初始化。內建和復合型別的成員如指標、陣列,只對定義在全域性作用域中的物件初始化,當物件定義在區域性作用域時,內建和符合型別的成員不進行初始化。在某些情況下,預設建構函式是由編譯器隱式使用的。

【explicit關鍵字】 

在c++中,當定義了只有乙個引數的建構函式時,同時也定義了一種隱式的型別轉換。(例如double a=3.14; int b=a;這裡b=3,是因為編譯器自動轉換,同樣的,類和物件也存在這樣的轉換關係) 

用explicit修飾建構函式,抑制由建構函式定義的隱式轉換,explicit關鍵字類內部的構建宣告上,在類的定義體外部的定義上不再重複。

如果程式想通過已有的物件複製出新的物件,就需要呼叫拷貝建構函式,拷貝建構函式是只有單個形參,而且該形參是對本類型別的引用(常用const)的建構函式,拷貝建構函式是特殊的建構函式,建立物件時使用已存在的同類物件來進行初始化,當我們沒提供拷貝建構函式時編譯器會自動建立預設的拷貝建構函式。看**:

class date

date(const date& date)//拷貝建構函式

private:

int _year; 

int _month;

int _day;

};int main()

3、傳值方式作為函式返回值

date funtest()

析構函式和建構函式功能相反,在物件被銷毀時,由編譯器自動呼叫,完成類的一些資源清理和收尾工作。析構函式的語法與建構函式一樣,用類名作為函式名,區別是析構函式前面有個符號~,有建構函式不同的是,析構函式沒有引數。它是在物件釋放前程式自動呼叫的,如果我們沒有提供虛構函式,編譯器將會自動生成乙個預設的析構函式。

看一下析構函式的特點: 

①乙個類裡面只有乙個,物件被銷毀的時候只呼叫一次。 

②不能有引數,也不能有返回值,因此析構函式不能過載 

③如果沒有顯示的給出,編譯器會預設生成乙個。 

④在物件生命週期結束的時候,由編譯器自動呼叫。 

⑥析構函式在函式體內並不是刪除物件,而是做一些清理工作。這裡有一點不得不提一 下:用delete來銷毀物件時,會呼叫其析構函式,並將所佔的全域性堆記憶體空間返回。但從銷毀物件到程式退出該作用域,物件的指標還存在於棧 中,並指向物件本來的位置。顯然,這種情況下呼叫指標是非常危險的。win32平台下訪問這種指標,結果有三種可能情況:訪問違例、取得無意義值、取得其 他物件。第一種會導致程序崩潰,後兩種雖然不會立即崩潰,但是可能會有不可**的行為操作或造成物件不必要的變化,需要謹慎避免。 

⑦析構順序:利用棧的特性,先進後出,所以對後進的物件先進行析構,如果有全域性物件或者靜態區域性物件,則它們在main函式結束或者呼叫exit函式時被析構。

如果已經定義了多個物件,這些同型別物件之間可以相互賦值,物件賦值可以通過"="來實現,這是因為編譯器提供了乙個預設的賦值運算子過載,看**:

class date

date(int year,int month,int day)

:_year(year)

,_month(month)

,_day(day)

{}date& operator=(const date &date)//賦值運算子過載

private:

int _year; 

int _month;

int _day;

};int main()

date* operator&()

const date* operator&()const

c 類的預設成員函式

類的組成包括資料成員與成員函式。在類中一共有有六個預設成員函式,建構函式 拷貝建構函式 析構函式 賦值操作符過載 取位址操作符過載 const修飾的取位址操作符過載 利用乙個例項 日期類 進行舉例 先是定義乙個日期類 class date 這就是乙個簡單的類定義。下面依次介紹各個預設成員函式 一.建...

類的預設成員函式

class time time int hour,int minute,int second 有參的建構函式 time int hour 9,int minute 54,int second 23 全預設建構函式 time int hour,int minute 12,int second 30 半...

C 預設成員函式

概念 object oriented programming,縮寫 oop 是一種程式設計范型,同時也是一種程式開發的方法。物件指的是類的例項,將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性 靈活性和擴充套件性。c 不是純物件導向語言,而是基於物件導向的語言 ps 因為它包含c的...