C++結構體實例和類實例的初始化

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

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

 注意:

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

② 未指定值的數據成員編譯器會自動初始化爲默認值

③ 這種初始化對象方式,要求所有數據成員必須爲public型

④ 這種初始化對象方式,要求類中不能編寫任何構造函數

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型,或是提供了構造函數,必須使用構造函數來進行初始化。

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=,然後系統再釋放這個臨時產生的對象。系統默認的=運算是將源對象的數據成員的值複製到目標對象中的數據成員中。

三、接受一個參數的構造函數允許使用賦值句法初始化對象。

說明代碼如下:

#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;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章