天天看點

【C++再學習】【08】編譯時與運作時

(一)首先來看看const常量相關的編譯時與運作時:C++ const常量不同于有些語言,可以是編譯時常量,也可以是運作時常量。

int func()
{
  int x=0,y=1;
  return x+y;
}

int main()
{
  const int i = 0;
  int * p = (int *)&i;
  *p =1;
  int j = *p; 

  const int k = func();

  cout<<"i="<<i<<" j="<<j<<" k="<<k<<endl;

  return 0;
}
           

    運作結果

【C++再學習】【08】編譯時與運作時

      上邊代碼中指針p與const常量i的位址相同,通過p改變了該位址的值,但是從輸出結果可以看到i仍然是0而j成為1,這就是所謂的編譯時常量,程式在編譯時都已經将i替換為0,是以後續運作時的改變不會影響i的輸出,這也是編譯器優化技術中的常量折疊:在編譯階段,對該變量進行值替換,同時,該常量擁有自己的記憶體空間,并非像宏定義一樣不配置設定空間;而另一個k則是運作時常量,因為k的值隻用在執行了函數func()之後才能得到。

(二)再來看看跟多态相關的編譯時與運作時:C++中多态分為兩種,編譯時多态和運作時多态,編譯時多态主要指函數重載以及運算符重載等,而運作時多态主要指通過指針或引用調用虛函數達到動态綁定。注意運作時的多态隻能通過虛函數的繼承以及指針或者引用去調用才會實作,普通的函數、對象而不是指針或引用調用将不會起作用。