結構體實例(包括共用體)和類實例的初始化方法完全相同,二者都可以應用於繼承層次中。不同點是結構體(包括共用體)默認成員為public,而類默認成員是private型的。
一、若類和結構體所有資料成員均為public型,可採取如下帶花括號形式進行初始化。
注意:
① 不論值的個數多少,都必須使用花括號定界
② 未指定值的資料成員編譯器會自動初始化為默認值
③ 這種初始化對象方式,要求所有資料成員必須為public型
④ 這種初始化對象方式,要求類中不能編寫任何建構函式
1 2 3 4 5 6 7 8 9 |
struct S { //class S 效果一樣 int x; unsigned short y; }; S testS1={100,123}; S testS2={200};//未指定值的資料成員初始化為預設值,這裡os2.y=0; S TestS[4]={ {100,10}, {200,20}, {300} };//未指定值的初始化為預設值,os[2].y,os[3].x,os[3].y。 |
二、若資料成員有private或protected型,或是提供了建構函式,必須使用建構函式來進行初始化。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
struct S { //class S可自行試驗,結果相同 private: int x; public: double y; S(void){} S(int idemo,double ddemo) {x=idemo;y=ddemo;} void show(void) {cout<<x<<''/t''<<y<<endl;} }; S os1;//將呼叫預設建構函式(無參建構函式) S os2(1000,2.345); S os3=S(2000,4.567); S os[4]={S(10,1.234),S(20,2.234)};//未初始化的將呼叫預設建構函式。如此時沒有預設建構函式會出錯。 |
重要提示:
① 在S os3=S(2000,4.567);語句中,因是宣告並初始化os3對象,所以將調用S(int,double)建構函式對os3進行初始化。
② S os3(2000,4.567); 等價於 S os3=S(2000,4.567);
③ 但如果os3已經存在了,S os3(100,1.234);os3=S(2000,4.567),則表示用一個臨時對象賦值給os3,將調用operator=,然後系統再釋放這個臨時產生的對象。系統默認的=運算是將源對象的資料成員的值復制到目標對象中的資料成員中。
三、接受一個引數的建構函式允許使用賦值句法初始化對象。
說明程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <iostream> using namespace std; class C { private: int x; public: C(int idemo) {x=idemo;} void show(void) {cout<<x<<endl;} }; struct S { private: int x; public: S(int idemo) {x=idemo;} void show(void) {cout<<x<<endl;} }; int main(int argc, char *argv[]){ C oc=1000;//不能企圖加花括號 oc.show(); S os=2000;//不能企圖加花括號 os.show(); return EXIT_SUCCESS; } |