oop往屆題總結

隨口一句:若是析構函數的函數頭沒有給出來,(看看這個類會不會成爲基類),若是會成爲基類那就必需要把析構函數設置成虛析構函數,若是不會成爲基類就隨便。能夠是虛析構也能夠普通的析構函數。數組

2012~2013 秋季學期函數

1.問:複製構造函數中爲何首先要將指針x初始化爲NULL?與其後面執行的語句有什麼關係?this

回答:複製構造函數體中使用了賦值運算符函數,而賦值運算符函數中若x不爲NULL,則執行delete[]操做。若不將x初始化爲NULL,其值可能不可預知,且可能不爲NULL,直接執行delete[]將出錯。spa

 

2.問:爲何將運算符函數operator<<重載爲友元函數?操作系統

回答:由於運算符函數operator<<是雙目運算,並且該函數的第一個操做數不是本類的對象不能將其定義爲成員函數,因此重載爲友元函數指針

 

3.問:派生類Derived或RationalNumber類的構造函數中爲何要顯式地使用冒號語法規則對基類的數據成員進行初始化?對象

回答:由於基類Base沒有默認的構造函數內存

 

 

2014~2015 秋季學期作用域

1.鏈表類的深賦值函數io

 LinkList &     operator=(const LinkList &link)

   {

      if(⑧  &link == this        )

         return *this;

      FreeList();

      Node *p, *q;

      for(p=link.head; ⑨  p!=NULL  ; p=p->next)

      {

         if(head==NULL)

            head = q = new Node(p->data);

         else

         {

            q->next = new Node(p->data);

            q = q->next;

         }

      }

      ⑩  q->next = NULL    ; (這個的意思就是讓尾節點的next變成NULL,防止尾節點變成一個野指針處處亂指到奇怪的東西)

      return *this;

   }

 

2.(第三大題的第一小問)

Test *p, t1;

   p = new Test(10);

   Test t2(2, 3);

   cout << *p << '\n'

         << t1 << '\n'

         << t2 << endl;

   delete p;  //在這裏就是delete主動調用析構函數

   cout << "退出程序,返回操做系統" << endl;  

  //系統自動調用析構函數,先構造的後析構,後構造的先析構

 

 

2015~2016 秋季學期

1. char &    operator[](int index) {  return x[index]; }    //這裏的char &表示返回一個char數組的引用

2.全局對象和自動對象的區別是,全局對象放在靜態儲存區,而自動對象在棧區。全局變量或是全局對象通常等程序徹底結束以後系統自動銷燬,而局部變量在超出做用域自動銷燬。

3.(題目3.2 結合整個代碼來看 這裏放不下了)

Test1 x(100);               // 建立一個全局對象

void f(Test1 t)

{

   Show();

int main()

{

   Show();

   f(x);  //在調用f函數 傳參數的時候調用了拷貝構造函數 因此num++ sum也加了 但在後面銷燬t的時候num-- num和sum又變回原來的樣子

   Show();

   return 0;

}

這裏的輸出是:

Num =,     Sum = 100     

Num =,     Sum = 200    //出現疑問的地方

Num =,     Sum = 100 

4.也是3.2這道題,思路差很少 在造a數組的時候拷貝構造了兩次

 

2016~2017

1. 題目3.1當中的b.add().add();   

其中add()函數的樣子:

ctest add()                         // 本成員函數爲值返回

   {

      ctest temp(*this);

      ++a;

      return temp;

   }

這句話的意思是,先是b調用了add()函數,add()函數調用結束以後把temp析構,返回了一個臨時無名變量,後來再西溝一次

 

2017~2018 秋季學期

1.那個用不一樣語言打招呼的題目,爲何test0302C(c)用到的是基類的SayHello()和SayByebye()呢?

回答:test0302C是一個值傳遞的函數,須要用到拷貝構造函數,可是這裏沒有定義拷貝構造,因此就用基類的默認拷貝構造函數,因此就強制類型轉換把c轉換成了Language類。

2. 3.3這道題爲何最後的max和min是100和-50呢?

回答:這是由於d,e,f都是拷貝構造函數生成的,沒有用本身定義的構造函數,也就沒有加入排列max和min的陣營中。

3.用一個長長的數組去填充一個可能沒那麼長的數組記得從新分配一下內存。

 

 

 

2017直招試卷

1.RMB那道題,在有運算符號的時候就輸出一個數,其餘時候就做爲一個rmb對象輸入成幾元幾角幾分。(由於rmb這個類並無重載運算符,在作運算的時候要強制類型轉換,就轉換成了unsigned int (你看有一個強制類型轉換函數)) 

operator unsigned int() const

   {      // 類型轉換函數,可將RMB類型的對象轉換成unsigned int類型數據

      return 100*yuan+10*jiao+fen;

   }

 

2.Animal和cat的題目

show函數是一個虛函數,派生類cat裏面對於show函數的定義會覆蓋前面的animal基類中定義的show函數

可是print函數不是虛函數,因此它是什麼類就會調用什麼類的print函數

在構造一個派生類的時候須要先派生基類,再派生那個派生類

 

 

大功告成!!!吃餃子去咯!

但願我明天能夠考超級高的分!必定要4.0哦!

相關文章
相關標籤/搜索