C語言中的struct有類似建構函式的概念嗎?

時間 2021-06-03 01:07:17

1樓:louiet

建構函式並不是用來"建立"乙個物件的,而是初始化乙個物件的,因為在呼叫所謂的建構函式前物件就已經被構造出來了(記憶體分配好了),建構函式所做的事情只不過是給成員賦值而已。所以即使C中沒有內建建構函式,複製建構函式,析構函式這些機制,你也完全可以定義一堆普通函式實現相同的作用,至於優缺點就是C艹中,這些函式會在物件生命週期的某個時刻自動被呼叫,而用C手動實現的就要自已在適當的位置手動呼叫。

2樓:

如果只是賦初始值的話,可以用初始化列表。但如果想執行諸如分配記憶體之類的初始化操作的話,那是沒有辦法的。

你可以在結構體外面寫乙個init函式,手動呼叫你需要的函式(比如malloc)執行初始化操作,同理還有析構函式。而C++的建構函式和析構函式則是自動執行的(定義棧物件或者呼叫new/delete )

3樓:

沒有。但是你可以寫假的建構函式,方便初始化結構體,當然要malloc出來的結構體寫建構函式才有意義。

Person *p = new_Person(「鍵盤俠」,28);

4樓:暮無井見鈴

C 的 struct 沒有建構函式。

硬要說定義變數(物件)的實現的話,就是預留好全域性/棧空間。初始化的實現基本同賦值。

和 C++ 中有非平凡建構函式的類相比

優點:不需要初始化(只用 malloc 的場合)就能得到合法物件缺點:只有聚合初始化一種初始化方法,有時(特別是只用 malloc 的場合)要用其他手法初始化

仔細想下還是刪掉了,具名建構函式還是能寫,開優化後和建構函式基本一樣。

5樓:zpan

/* 方式一 */

struct

Foofoo

;foo_init(&

foo,

...);

/* 方式二 */

struct

Foo*

foo=

foo_new

(...);

6樓:Milo Yip

C 語言沒有建構函式的概念。如同內建型別的變數,

定義全域性或靜態的 struct 變數時,其成員會初始化為零;

定義區域性的 struct 變數時,其成員為不確定值。

C 語言可對 struct(以及 union 和陣列)變數使用初始化列表,如:

typedef

struct

Vector2

;Vector2a=

;Vector2b=

;//C99designator

C++ 在沒有建構函式、沒有繼承基類、沒有私有/保護的非成員變數等條件下(詳看 聚合初始化),也可以用初始化列表,與 C 相容;但 designator 語法在 C++20 才會有。

在實踐上,雖然 C 語言沒有建構函式的概念,也不妨礙使用者自行定義函式作初始化,如:

Vector2

Vector2Init

(floatx,

floaty)

;returnr;

}void

foo()

或void

Vector2Init

(Vector2*v

,floatx,

floaty)

void

foo()

這種 struct 初始化方式的「優點」是,使用者可用多個不同名字的函式定義不同的初始化方式。而 C++ 建構函式必須和類同名,只能通過引數型別來區分,例如用 std::piecewise_construct 這些東西。

缺點是,無法規避使用者不呼叫函式,而 C++ 是可以自動呼叫預設建構函式,或故意產生編譯錯誤,令使用者知道忘記了寫初始化引數,從而避免了一些 bug。相似地,C++ 也有析構函式,兩者造就 C++ 的一大特徵 RAII(Resource Acquisition Is Initialization)。

c語言中如何得到類似202005091224這樣的時間字串?

w2014 1.很明顯,在8371年4月16日 5點20分24秒獲得從1970年1月1日零時經歷的秒數即可 2.實際上,這個功能和ctime提供的功能非常類似。因此,順著ctime的文件溜達一圈,就不難發現strftime這個函式。include include intmain CuKing 原來有...

c語言中 include stdio h , 的作用是什麼,為什麼不能去掉 ?

nullptr 表示這是預處理語句,由預處理器來處理。至於為啥是 這就是語法設計的事情了,也可以設計成 include等等。C C 標準已經規定是 開頭了,編譯器都是以檢測這個符號來做判定了,所以你如果想去掉,那麼就要去改C C 的編譯器,做乙個屬於你自己的編譯器。 程式設計思維 號表示這一行後面的...

C語言中的選擇排序?

郭建波 選擇排序的過程 陣列排序前 7 23 12 4 33 21 2 17 13 9 第一輪迴圈 2 23 12 4 33 21 7 17 13 9 第二輪迴圈4 12 23 33 21 7 17 13 9 第三輪迴圈7 23 33 21 12 17 13 9 第四輪迴圈9 33 21 12 17...