關於c 建構函式的一些淺理解

2021-10-13 07:29:20 字數 1423 閱讀 4133

建構函式是物件在被建立的時候,由編譯器自動呼叫並且分配記憶體空間的函式(不管你寫不寫它都會有),作用是初始化物件的成員

1、預設建構函式

語法:類名(){}

每乙個類都自帶乙個預設建構函式,函式內為空,如果你寫了預設建構函式,則執行時編譯器將會呼叫你寫的預設建構函式。

2、有參建構函式

語法:類名(引數1,引數2…){}

有參構造有兩種初始化方式,一是賦值法,二是初始化列表,賦值法通俗易懂,初始化列表是通過 **類名(引數1,引數2…):成員1(引數1),成員2(引數2)…{}**來實現的。推薦使用第二種方法,雖然兩種方法執行效率差不多,但是二者有本質的區別,法一的成員變數是被賦值了而不是初始化,法二發生的時間更早,發生在成員的default建構函式被自動呼叫之時。

3、拷貝建構函式

語法:類名((const)類名 &變數){}

顧名思義,拷貝建構函式就是將乙個物件的所有成員拷貝到新的物件上,其實編譯器也提供拷貝建構函式,通過編譯器自帶的拷貝建構函式進行拷貝的方法被稱為淺拷貝,這樣的拷貝是逐字節的拷貝,即二者一模一樣,但是存在乙個問題,如果我們建立乙個指標並在堆區開闢記憶體,在拷貝完成之後根據順序會先呼叫被拷貝物件的析構函式來delete這個記憶體,然後拷貝物件再呼叫析構函式釋放記憶體,但由於二者的指標指向同一片記憶體區域,所以會存在重複釋放的問題,故需要自行建立拷貝函式,這樣稱為深拷貝,深拷貝並不是簡單的複製貼上,而是另外開闢一片記憶體空間,這就避免重複釋放。

注意 如果寫了有參建構函式和拷貝建構函式那麼編譯器將不再提供預設建構函式,如果需要使用,需要你自己寫。

#include

using

namespace std;

class

person

person

(int a)

person

(const person &p)

~person()

int age;};

void

test01()

intmain()

#include

using

namespace std;

class

person

person

(int age,

int height)

~person()

cout<<

"person析構函式呼叫"

<}person

(const person &p)

int m_age;

int*m_height;};

void

test01()

intmain()

關於c 靜態的一些淺理解

目前為止我所知道的靜態包括靜態成員變數和靜態成員函式兩種。二者都是在返回值型別前面新增static關鍵字,都可以通過類名直接訪問。對於靜態成員變數,其分為全域性靜態變數和區域性靜態變數,二者都位於靜態儲存區。在類內定義靜態成員變數時,不可以在類內初始化,為什麼呢?我的理解是,靜態成員變數屬於整個類,...

建構函式的一些理解

首先寫乙個 person 的建構函式 如下 person 建構函式中的 this 指向new出來的物件例項,也就是 p1,通過new person 實參1 實參2 將實參傳入 person建構函式中,建立出新的物件p1 prototype 原型 在person 的原型上新增 say 方法,通過在原型...

C 構造 析構的一些理解

wiki c 類 effective c 構造 析構 賦值運算子 構造 析構 賦值運算子 c 類四個預設函式 建構函式 析構函式 拷貝函式 賦值函式 建構函式 析構函式 拷貝函式 賦值函式 c 多個建構函式的問題 概要 在c 中,每乙個類都會有乙個或多個建構函式,乙個析構函式,乙個賦值函式。建構函式...