C 中類的6個預設函式

2021-08-10 16:38:41 字數 1787 閱讀 3671

類的6個預設的成員函式包括:

建構函式、析構函式、拷貝建構函式、賦值運算子過載函式、取位址操作符過載、const修飾的取位址操作符過載。

以下詳細介紹前四個函式。

一、建構函式

cgoods()

例項化乙個物件:

1、分配物件記憶體空間

2、呼叫物件的建構函式

初始化:定義的同時賦值。

賦值:定義後,再賦值。

建構函式以類名為函式名,無返回值,可以過載可以帶引數,在例項化乙個物件的時候系統自動呼叫

如果使用者自己沒寫建構函式,系統會呼叫系統預設的建構函式,系統預設的函式是public和inline的

二、析構函式

析構函式:釋放物件的記憶體空間所佔的資源(堆記憶體資源、檔案描述符等)

~cgoods()

銷毀乙個物件

1、呼叫析構函式清理物件所佔資源

2、清理記憶體空間

析構函式在類名前加上~運算子,無返回值,不帶引數不可以過載,在return後由系統自動呼叫

注意:手動呼叫析構函式=呼叫乙個普通函式,清理記憶體空間後系統還會自動呼叫一次析構函式,因此不建議手動呼叫析構函式。

後構造的函式先析構,先構造的函式後析構,與棧相似。

三、拷貝建構函式

拷貝建構函式:用乙個已經存在的物件初始化相同型別的新物件時呼叫的函式

物件自己的成員,可以任意訪問自己的其他任何訪問限定成員方法和成員變數

cgoods(const cgoods &rhs)          //必須傳引用,為了防止實參和形參遞迴構造

const的作用:

1、修飾形參不能改變

2、接收隱式產生的臨時量

淺拷貝:多個物件指向同乙個資源

int *p=new int(50);

int *q=p;

int q1=q;

深拷貝:多個物件擁有各自的資源

int *p=new int(50);

int *q=new int();

*q=*p;

四、賦值運算子過載函式

賦值運算子過載函式:用已存在的物件給另乙個已存在的物件賦值

void operator(const cgoods &rhs)   //可以值傳遞但是引用效率高,因為沒有開闢新棧幀

delete _name;

_name=new char[strlen(rhs._name)+1];

strcpy(_name,rhs._name);

_amount=rhs._amount;

_price=rhs._price;

}

系統提供的賦值運算子過載函式:

1、多次釋放同一資源

2、記憶體洩漏

自定義的賦值運算子過載函式:

1、防止自賦值

2、釋放舊資源

3、開闢新資源進行初始化

系統提供的拷貝函式都是淺拷貝,如果發生淺拷貝,應該自己提供建構函式、拷貝建構函式、賦值運算子過載函式

編譯器編譯類分為三步:

1、先掃瞄類名

2、再掃瞄所有的成員變數

3、最後再掃瞄所有的方法體和形參的預設值

C 類的6個預設函式

在c 中預設產生6個類成員函式,即預設函式,它們分別是 預設建構函式 預設拷貝建構函式 預設析構函式 預設賦值運算子 預設取址運算子 預設取位址運算子const 很多人以為只有前4個預設函式,事實上有6個。驗證如下 可見,我們在沒有寫函式功能的情況下,進行構造,析構,拷貝等等操作都是可以實現的,這就...

C 類的6個預設函式

在c 中預設產生6個類成員函式,即預設函式,它們分別是 預設建構函式 預設拷貝建構函式 預設析構函式 預設賦值運算子 預設取址運算子 預設取位址運算子const 很多人以為只有前4個預設函式,事實上有6個。驗證如下 include using namespace std class a int ma...

C 類中6個預設的函式(一)

c 的類中有6個預設的函式,它們分別是 建構函式 析構函式 拷貝建構函式 賦值運算子的過載函式 取位址操作符的過載函式 const修飾的取位址操作符的過載函式 這6個預設的函式有兩個特點 共有的 內聯的 今天我們先來看看前三個預設的函式 建構函式 析構函式和拷貝建構函式 我們都知道,c 中乙個物件的...