C++ 實踐總結


  1. 對於一個應用程序而言,靜態鏈接庫可能被加載多次,而動態鏈接庫只會被加載一次。

  2. Gameloft面試之錯誤一

Event:

面試官說如下程序是可以鏈接通過的.

class Base

{

Public:

    Base(void)

    {

      this-> initialize();

}

     virtual void initialize(void) = 0; 

};

 

class Derived : public Base

{

Public:

      virtualvoid initialize(void)

      {

      }

};

 

Base* obj = new Derived;

 

In fact:

  鏈接根本不能通過,原因:虛函數表是在構造函數調用完成之後才完成初始化的。

 

Summary:

虛擬函數表在對象創建完成後才被初始化,而在構造基類構造函數去掉用虛函數時是無法調用到派生類實現接口的:如下例子鏈接定會失敗(無論gcc還是vs編譯器)(總結: 牢記自己曾今的研究):

 

  1. Gameloft面試之錯二

Event:

面試官說如下寫法是可通過編譯的:

class A

{

     const char* func(const char*const str) const

     {

        char* temp = str;

     }

};

In fact:

  編譯時不能通過的: “const char*”類型的值不能用於初始化”char*”類型實體

Summary:

   應堅定地相信自己自己通過科學做出的判斷

 

  1. Gameloft面試之錯三

Event:

    面試官說如下寫法大多數編譯器不支持

void(ClassName::  *px)(void);

 

  In fact:

    實踐證明,VSGCC編譯器均支持該寫法

 

  Summary

    該寫法並未違背C++標準,應當被支持,至於除VS,GCC之外的編譯器未曾瞭解.

 

  1. 數組指針的初始化及銷燬(new/delete)操作:(gameloft面試後思考)

    int (*parr)[10] = (int(*)[10])( new int[10] );

    delete [] parr;

     

  2. 在多繼承的時候,dynamic_cast返回nullptr的情況:

    現有2個基類: base1base2

    二級基類:    base3同時繼承與base1, base2

    對於對於子類derived, 如果子類是非public繼承與base3

    但用基類base2指針保存derived對象時,dynamic_cast轉換基類base2指針

    base1指針,會失敗返回nullptr

     

 

發佈了41 篇原創文章 · 獲贊 35 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章