struct的初始化及其建構函式

2021-07-04 10:08:32 字數 1442 閱讀 5591

結構體例項(包括共用體)和類例項的初始化方法完全相同,二者都可以應用於繼承層次中。不同點是結構體(包括共用體)預設成員為public,而類預設成員是private型的。

一、若類和結構體所有資料成員均為public型,可採取如下帶花括號形式進行初始化。

注意:① 不論值的個數多少,都必須使用花括號定界

② 未指定值的資料成員編譯器會自動初始化為預設值

③ 這種初始化物件方式,要求所有資料成員必須為public型

④ 這種初始化物件方式,要求類中不能編寫任何建構函式

struct s ;

s tests1=;

s tests2=;//未指定值的資料成員初始化為預設值,這裡os2.y=0;

s tests[4]=,

, };//未指定值的初始化為預設值,os[2].y,os[3].x,os[3].y。

《windows核心程式設計》中我們會遇到:startupinfo si = ,就是對si結構體的初始化。

個人補充:

1、struct裡面如果只有public型別的資料,則可以通過{}直接複製,沒有複製的資料預設為0:

class cl

;struct st

;int main()

; cl c={};

cout<

結果為:0,0;0,0

2.沒有自己顯示定義建構函式時

class cl

;struct st

;int main()

int a;

int b;

};struct st

int a;

int b;

};int main()

{ st s;

cl c;

cout此時的執行結果是:

不會報錯,由於預設建構函式沒有賦值,所以是暫存器原來的資料。

原因:(見c++ primer p392)

乙個類哪怕只定義乙個建構函式,編譯器也不會再生成預設建構函式。

合成的預設建構函式使用與變數初始化相同的規則來初始化成員。具有類型別的成員通過執行各自的預設建構函式來進行初始化。內建型別和復合型別的成員,如指標和陣列,只能定義在全域性作用域中的物件才初始化。當物件定義在區域性作用域中時,內建或復合型別的成員不進行初始化。

如果類包含內建型別或復合型別的成員,則該類不應該依賴於合成的預設建構函式,而應該定義自己的建構函式來初始化這些成員。

每個建構函式應該為每個內建或復合型別的成員提供初始化。沒有初始化內建或復合型別成員的建構函式,將使那些成員處於未定義的狀態。除了作為賦值的目標之外,以任何方式使用乙個未定義的成員都是錯誤的。

struct的初始化及其建構函式

struct的初始化及其建構函式 結構體例項 包括共用體 和類例項的初始化方法完全相同,二者都可以應用於繼承層次中。不同點是結構體 包括共用體 預設成員為public,而類預設成員是private型的。一 若類和結構體所有資料成員均為public型,可採取如下帶花括號形式進行初始化。注意 不論值的個...

struct的初始化

在android的底層裝置定義中,會出現很多這樣的 結構體初始化專案 裝置檔案操作方法表 static struct file operations hello fops 這就是指定初始化在linux裝置驅動程式,它源自iso c99標準。這種方式的優勢就在於由此初始化不必嚴格按照定義時的順序。已知...

java中靜態初始化塊,例項初始化塊,建構函式區別

public class people public people string name param args public static void main string args 執行效果 new兩個例項,從執行結果可以看出,靜態變數和靜態初始化塊都是在類載入到系統時,載入到系統中,靜態初始化...