<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. 試題

    計算機二級C++復習資料:類對象數組和靜態成員

    時間:2025-03-27 22:45:46 試題 我要投稿
    • 相關推薦

    2016年計算機二級C++復習資料:類對象數組和靜態成員

      一、類對象數組

    2016年計算機二級C++復習資料:類對象數組和靜態成員

      類的對象和C++其他數據類型一樣,也可以為其建立數組,數組的表示方法和結構一樣。

      #include iostream.h

      class Date

      {

      int mo,da,yr;

      public:

      Date(int m=0,int d=0, int y=0) { mo=m; da=d; yr=y;}

      void display() const { cout < };

      int main()

      {

      Date dates[2];

      Date today(12,31,2003);

      dates[0]=today;

      dates[0].display();

      dates[1].display();

      return 0;

      }

      1.類對象數組和默認構造函數

      在前面已經說過,不帶參數或者所有參數都有默認值的構造函數叫做默認構造函數。如果類中沒有構造函數,編譯器會自動提供一個什么都不做的公共默認構造函數 。如果類當中至少有一個構造函數,編譯器就不會提供默認構造函數。

      如果類當中不含默認構造函數,則無法實例化其對象數組。因為實例花類對象數組的格式不允許用初始化值來匹配某個構造函數的參數表。

      上面的程序中,main()函數聲明了一個長度為2的Date對象數組,還有一個包含初始化值的單個Date對象。接著把這個初始化的Date對象賦值給數組中第一個對象,然后顯示兩個數組元素中包含的日期。從輸出中可以看到,第一個日期是有效日期,而第二個顯示的都是0。

      當聲明了某個類的對象數組時,編譯器會為每個元素都調用默認構造函數。

      下面的程序去掉了構造函數的默認參數值,并且增加了一個默認構造函數。

      #include

      class Date

      {

      int mo, da, yr;

      public:

      Date();

      Date(int m,int d,int y) { mo=m; da=d; yr=y;}

      void display() const { cout < };

      Date::Date()

      {

      cout < mo=0; da=0; yr=0;

      }

      int main()

      {

      Date dates[2];

      Date today(12,31,2003);

      dates[0]=today;

      dates[0].display();

      dates[1].display();

      return 0;

      }

      運行程序,輸出為:

      Date constructor running

      Date constructor running

      12/31/2003

      0/0/0

      從輸出中可以看出,Date()這個默認構造函數被調用了兩次。

      2.類對象數組和析構函數

      當類對象離開作用域時,編譯器會為每個對象數組元素調用析構函數。

      #include iostream.h

      class Date

      {

      int mo,da,yr;

      public:

      Date(int m=0,int d=0,int y=0) { mo=m; da=d; yr=y;}

      ~Date() {cout < void display() const {cout< };

      int main()

      {

      Date dates[2];

      Date today(12,31,2003);

      dates[0]=today;

      dates[0].display();

      dates[1].display();

      return 0;

      }

      運行程序,輸出為:

      12/31/2003

      0/0/0

      Date destructor running

      Date destructor running

      Date destructor running

      表明析構函數被調用了三次,也就是dates[0],dates[1],today這三個對象離開作用域時調用的。

      二、靜態成員

      可以把類的成員聲明為靜態的。靜態成員只能存在唯一的實例。所有的成員函數都可以訪問這個靜態成員。即使沒有聲明類的任何實例,靜態成員也已經是存在的。不過類當中聲明靜態成員時并不能自動定義這個變量,必須在類定義之外來定義該成員。

      1.靜態數據成員

      靜態數據成員相當于一個全局變量,類的所有實例都可以使用它。成員函數能訪問并且修改這個值。如果這個靜態成員是公有的,那么類的作用域之內的所有代碼(不論是在類的內部還是外部)都可以訪問這個成員。下面的程序通過靜態數據成員來記錄鏈表首項和末項的地址。

      #include iostream.h

      #include string.h

      class ListEntry

      {

      public:

      static ListEntry* firstentry;

      private:

      static ListEntry* lastentry;

      char* listvalue;

      ListEntry* nextentry;

      public:

      ListEntry(char*);

      ~ListEntry() { delete [] listvalue;}

      ListEntry* NextEntry() const { return nextentry; };

      void display() const { cout < };

      ListEntry* ListEntry::firstentry;

      ListEntry* ListEntry::lastentry;

      ListEntry::ListEntry(char* s)

      {

      if(firstentry==0) firstentry=this;

      if(lastentry!=0) lastentry- >nextentry=this;

      lastentry=this;

      listvalue=new char[strlen(s)+1];

      strcpy(listvalue,s);

      nextentry=0;

      }

      int main()

      {

      while (1)

      {

      cout <<\nEnter a name ('end' when done): ;

      char name[25];

      cin >>name;

      if(strncmp(name,end,3)==0) break;

      new ListEntry(name);

      }

      ListEntry* next = ListEntry::firstentry;

      while (next != 0)

      {

      next- >display();

      ListEntry* hold = next;

      next=next- >NextEntry();

      delete hold;

      }

      return 0;

      }

      程序首先顯示提示信息,輸入一串姓名,以end作為結束標志。然后按照輸入順序來顯示姓名。構造函數將表項加入鏈表,用new運算符來聲明一個表項,但并沒有把new運算符返回的地址賦值給某個指針,這是因為構造函數會把該表項的地址賦值給前一個表項的nextentry指針。

      這個程序和前面將的逆序輸出的程序都不是最佳方法,最好的方法是使用類模板,這在后面再介紹。

      main()函數取得ListEntry::firstentry的值,開始遍歷鏈表,因此必需把ListEntry::firstentry設置成公有數據成員,這不符合面向對象程序的約定,因為這里數據成員是公有的。

      2.靜態成員函數

      成員函數也可以是靜態的。如果一個靜態成員函數不需要訪問類的任何實例的成員,可以使用類名或者對象名來調用它。靜態成員通常用在只需要訪問靜態數據成員的情況下。

      靜態成員函數沒有this指針,因為它不能訪問非靜態成員,所以它們不能把this指針指向任何東西。

      下面的程序中,ListEntry類中加入了一個靜態成員函數FirstEntry(),它從數據成員firstentry獲得鏈表第一項的地址,在這兒,firstentry已經聲明為私有數據成員了。

      #include iostream.h

      #include string.h

      class ListEntry

      {

      static ListEntry* firstentry;

      static ListEntry* lastentry;

      char* listvalue;

      ListEntry* nextentry;

      public:

      ListEntry(char*);

      ~ListEntry() { delete [] listvalue;}

      static ListEntry* FirstEntry() { return firstentry; }

      ListEntry* NextEntry() const { return nextentry; };

      void display() const { cout < };

      ListEntry* ListEntry::firstentry;

      ListEntry* ListEntry::lastentry;

      ListEntry::ListEntry(char* s)

      {

      if(firstentry==0) firstentry=this;

      if(lastentry!=0) lastentry- >nextentry=this;

      lastentry=this;

      listvalue=new char[strlen(s)+1];

      strcpy(listvalue, s);

      nextentry = 0;

      }

      int main()

      {

      while (1)

      {

      cout <<\nEnter a name ('end' when done):;

      char name[25];

      cin >> name;

      if(strncmp(name,end,3)==0) break;

      new ListEntry(name);

      }

      ListEntry* next = ListEntry::FirstEntry();

      while (next != 0)

      {

      next- >display();

      ListEntry* hold = next;

      next = next- >NextEntry();

      delete hold;

      }

      return 0;

      }

      函數ListEntry::FirstEntry()是靜態的,返回靜態數據成員firstentry的值。

      3.公有靜態成員

      如果一個靜態成員象上面程序一樣是公有的,那么在整個程序中都可以訪問它。可以在任何地方調用公有景泰成員函數,而且不需要有類的實例存在。但公有靜態成員函數不完全是全局的,它不僅僅存在于定義類的作用域內。在這個作用域里面,只要在函數名前加上類名和域解析運算符::就可以調用該函數。

    【計算機二級C++復習資料:類對象數組和靜態成員】相關文章:

    計算機二級《C++》考點解析:堆和類數組07-20

    C++類的成員變量和成員函數06-01

    計算機二級考試《C++》復習資料:類的轉換08-12

    php靜態成員變量06-22

    C++返回對象和返回引用05-31

    PHP一般數組與對象數組12-11

    2017計算機二級C++考點類的轉換05-20

    Java對象和類04-03

    詳解C/C++中堆和棧及靜態數據區03-18

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人