C 物件的初始化和清理

2021-10-25 17:49:59 字數 3060 閱讀 1126

物件的初始化和清理也是兩個非常重要的安全問題

​ 乙個物件或者變數沒有初始狀態,對其使用後果是未知

​ 同樣的使用完乙個物件或變數,沒有及時清理,也會造成一定的安全問題

c++利用了建構函式析構函式解決上述問題,這兩個函式將會被編譯器自動呼叫,完成物件初始化和清理工作。

物件的初始化和清理工作是編譯器強制要我們做的事情,因此如果我們不提供構造和析構,編譯器會提供

編譯器提供的建構函式和析構函式是空實現。

建構函式語法:類名(){}

建構函式,沒有返回值也不寫void

函式名稱與類名相同

建構函式可以有引數,因此可以發生過載

程式在呼叫物件時候會自動呼叫構造,無須手動呼叫,而且只會呼叫一次

析構函式語法:~類名(){}

析構函式,沒有返回值也不寫void

函式名稱與類名相同,在名稱前加上符號 ~

析構函式不可以有引數,因此不可以發生過載

程式在物件銷毀前會自動呼叫析構,無須手動呼叫,而且只會呼叫一次

class person

//析構函式

~person() };

void test01()

int main()

兩種分類方式:

​ 按引數分為: 有參構造和無參構造

​ 按型別分為: 普通構造和拷貝構造

三種呼叫方式:

​ 括號法

​ 顯示法

​ 隱式轉換法

示例:

//1、建構函式分類

// 按照引數分類分為 有參和無參構造 無參又稱為預設建構函式

// 按照型別分類分為 普通構造和拷貝構造

class person

//有參建構函式

person(int a)

//拷貝建構函式

person(const person& p)

//析構函式

~person()

public:

int age;

};//2、建構函式的呼叫

//呼叫無參建構函式

void test01()

//呼叫有參的建構函式

void test02()

int main()

c++中拷貝構造函式呼叫時機通常有三種情況

示例:

class person 

person(int age)

person(const person& p)

//析構函式在釋放記憶體之前呼叫

~person()

public:

int mage;

};//1. 使用乙個已經建立完畢的物件來初始化乙個新物件

void test01()

//2. 值傳遞的方式給函式引數傳值

//相當於person p1 = p;

void dowork(person p1) {}

void test02()

//3. 以值方式返回區域性物件

person dowork2()

void test03()

int main()

預設情況下,c++編譯器至少給乙個類新增3個函式

1.預設建構函式(無參,函式體為空)

2.預設析構函式(無參,函式體為空)

3.預設拷貝建構函式,對屬性進行值拷貝

構造函式呼叫規則如下:

示例:

class person 

//有參建構函式

person(int a)

//拷貝建構函式

person(const person& p)

//析構函式

~person()

public:

int age;

};void test01()

void test02()

int main()

深淺拷貝是面試經典問題,也是常見的乙個坑

淺拷貝:簡單的賦值拷貝操作

深拷貝:在堆區重新申請空間,進行拷貝操作

示例:

class person 

//有參建構函式

person(int age ,int height)

//拷貝建構函式

person(const person& p)

//析構函式

~person()

}public:

int m_age;

int* m_height;

};void test01()

int main()

總結:如果屬性有在堆區開闢的,一定要自己提供拷貝建構函式,防止淺拷貝帶來的問題

總結:淺拷貝出錯的原因是因為相同的一塊記憶體空間被釋放了兩次

物件的初始化和清理,是使用建構函式和析構函式。建構函式分為有參和無參,或者分為普通和拷貝。

需要注意的是:為了使宣告的類更嚴謹,記住要新增4個函式,無參建構函式,有參建構函式,拷貝建構函式,析構函式。

物件的初始化和清理

建構函式和析構函式 構造 初始化 析構 清理 建構函式的語法 類名 析構函式語法 類名 1.建構函式沒有返回值也不寫void 1.建構函式沒有返回值也不寫void 2.函式名稱與類名相同 2.函式名稱與類名相同,在名稱前加 3.建構函式可以有引數,也可以過載 3.建構函式不可以有引數,不可以過載 4...

C 類和物件 物件的初始化和清理

4.2.1 建構函式和析構函式 物件的初始化和清理也是兩個非常重要的安全問題 乙個物件或者變數沒有初始狀態,對其使用後果是未知 同樣的使用完乙個物件或變數,沒有及時清理,也會造成一定的安全問題 c 利用了建構函式和析構函式解決上述問題,這兩個函式將會被編譯器自動呼叫,完成物件初始化和清理工作。物件的...

java 初始化和清理

區別過載方法可通過 1.引數不同 2.引數相同,順序不同 過載的引數是基本型別時,可提公升也可窄化轉換 char型略不同,公升至int型 package com.learn public class demo06 class dog public void bark float f,int x pu...