const類型常量運行時可否改其值

連接:https://www.nowcoder.com/questionTerminal/7f61bd5d05f8425aa86affd94a27f1ef
來源:牛客網
 函數

(一)首先來看看const 常量相關的編譯時與運行時: C++ const 常量不一樣於有些語言,能夠是編譯時常量,也能夠是運行時常量。優化

 

[cpp] view plaincopy.net

  1. int  func()  
  2. {  
  3.   int  x=0,y=1;  
  4.   return  x+y;  
  5. }  
  6.   
  7. int  main()  
  8. {  
  9.   const   int  i = 0;  
  10.   int  * p = ( int  *)&i;  
  11.   *p =1;  
  12.   int  j = *p;   
  13.   
  14.   const   int  k = func();  
  15.   
  16.   cout<<"i=" <<i<< " j=" <<j<< " k=" <<k<<endl;  
  17.   
  18.   return  0;  
  19. }  

    運行結果指針

i=0 j=1 k=1code

 

      上邊代碼中指針p與 const 常量 i 的地址相同,經過 p 改變了該地址的值,可是從輸出結果能夠看到 i 仍然是 0 而 j 成爲 1 ,這就是所謂的編譯時常量,程序在編譯時都已經將 i 替換爲 0 ,因此後續運行時的改變不會影響 i 的輸出,這也是編譯器優化技術中的常量摺疊:在編譯階段,對該變量進行值替換,同時,該常量擁有本身的內存空間,並不是像宏定義同樣不分配空間;而另外一個 k 則是運行時常量,由於 k 的值只用在執行了函數 func() 以後才能獲得。對象

 

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

相關文章
相關標籤/搜索