<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          c++ static關(guān)鍵字的進階-面試中的快問快答

          共 2761字,需瀏覽 6分鐘

           ·

          2023-05-29 03:32

          29bd9d9669abf55bb9c00d3ae9540870.webp

          摘要:static用法是面試過程中的高頻問題,本文由淺入深地總結(jié)出static的一些細節(jié)。

          3065c020c9c6458384993670f6e7100e.webp

          正文

          static關(guān)鍵字其實不難,簡單的歸納成八股文:

          • 不考慮類的情況

          ???? 隱藏 -所有不加static的全局變量和函數(shù)具有全局可見性,可以在其他文件中使用,加了之后只能在該文件所在的編譯模塊中使用,即內(nèi)部連接 默認(rèn)初始化為0,包括未初始化的全局靜態(tài)變量與局部靜態(tài)變量,都存在全局未初始化區(qū) 靜態(tài)變量在函數(shù)內(nèi)定義,始終存在,且只進行一次初始化,具有記憶性,其作用范圍與局部變量相同,函數(shù)退出后仍然存在,但不能使用。

          • 考慮類的情況

          ?static成員變量:只與類關(guān)聯(lián),不與類的對象關(guān)聯(lián)。定義時要分配空間, 不能在類聲明中初始化,必須在類定義體外部初始化 ,初始化時不需要標(biāo)示為static;可以被非static成員函數(shù)任意訪問。

          ?static成員函數(shù):不具有this指針,無法訪問類對象的非static成員變量和非static成員函數(shù); 不能被聲明為const、虛函數(shù)和volatile ;可以被非static成員函數(shù)任意訪問。


          面試過程中,如果你能夠答出上面的知識點,那么恭喜你,基本掌握static的特點,但過于表面。面試官可能會繼續(xù)追問你:


          1.你說static靜態(tài)局部變量只會初始化一次,那么具體是怎么實現(xiàn)的呢?

          ????簡單來說就是static修飾的局部靜態(tài)變量附近存放著1字節(jié)的標(biāo)識位(最多可以標(biāo)識8個靜態(tài)變量)用來標(biāo)識該變量是否初始化。此外,編譯器還會在標(biāo)識位附近加鎖用來保證局部靜態(tài)變量的初始化線程安全。


          2.static成員變量為什么不能在類的聲明中初始化,必須要在類定義體外初始化?

          ????靜態(tài)成員變量屬于類,而不屬于對象,因此,靜態(tài)成員變量只有一份副本,不像非靜態(tài)成員變量那樣每個對象都擁有自己的一份。如果在類聲明中初始化,那么可能就會出現(xiàn)重復(fù)初始化,導(dǎo)致鏈接的時候報錯,所以在類外初始化主要是為了保證只初始化一次。



          3.按照上一個問題,你說靜態(tài)成員變量在類定義體外顯式地初始化是為了保證只初始化一次,那為什么不能像靜態(tài)局部變量采用標(biāo)識位來保證只初始化一次呢?

          ????可以從生命周期上來切入,首先靜態(tài)局部變量的生命周期是從第一次執(zhí)行到定義靜態(tài)局部變量的語句時到程序結(jié)束,所以可以設(shè)置標(biāo)識位來避免重復(fù)定義。而靜態(tài)成員對象的生命周期和類聲明周期一樣,程序開始到程序結(jié)束,在編譯期間就已經(jīng)為靜態(tài)成員變量分配內(nèi)存了,所以沒辦法進行判斷。換句話說,靜態(tài)局部變量可以理解為運行時,當(dāng)然可以校驗標(biāo)識位,但是靜態(tài)成員變量是編譯時,邏輯已經(jīng)固定,不存在動態(tài)來判斷標(biāo)識位。


          4.static成員函數(shù)為什么不能被聲明為const,virtual和volatile?

          ??? const:const 成員函數(shù)是用來保證對象的常量性不變,即在該函數(shù)中不會修改對象的成員變量。但是 static 成員函數(shù)并不依賴于特定的對象,它只是屬于類本身,因此沒有必要將其聲明為 const。

          ??? virtual:virtual 是用來實現(xiàn)多態(tài)的關(guān)鍵字,它只適用于非靜態(tài)成員函數(shù)。static 成員函數(shù)不依賴于任何對象,也就無法實現(xiàn)多態(tài)特性,因此不能被聲明為virtual。?????????????? ??? volatile:volatile 關(guān)鍵字用于指示編譯器在優(yōu)化代碼時不應(yīng)該對變量進行緩存或優(yōu)化。但是 static 成員函數(shù)并不訪問任何對象的狀態(tài),也不受任何對象狀態(tài)的影響,因此沒有必要使用 volatile 修飾符。



          5.順便擴展下,為什么函數(shù)在類定義體里面定義不會出現(xiàn)重復(fù)定義的問題?

          ????首先,在類定義體里面定義函數(shù),默認(rèn)都是內(nèi)聯(lián)的,內(nèi)聯(lián)函數(shù)就是在調(diào)用該函數(shù)出進行插入代碼段,所以不會出現(xiàn)重復(fù)定義的問題。但是,在內(nèi)聯(lián)函數(shù)的《 條款30 透徹了解inlining的里里外外 》中得出,內(nèi)聯(lián)與否其實是編碼器自己決定的,但如果該函數(shù)比較大或者復(fù)雜,編譯器可能會決定不將其作為內(nèi)聯(lián)函數(shù)處理,而采用普通函數(shù)的方式來處理。這時候,該函數(shù)的實現(xiàn)代碼仍然會被放在一個單獨的代碼段中,但在需要調(diào)用該函數(shù)的地方,編譯器會插入一條跳轉(zhuǎn)指令來調(diào)用該函數(shù)。因此,這種方式仍然可以提高代碼的重用性和可維護性,但不能像內(nèi)聯(lián)函數(shù)一樣提高程序的執(zhí)行效率。



          至此,總結(jié)完畢,內(nèi)容如有不對可以私信或留言,歡迎請批評指正,如果覺著內(nèi)容對你有點幫助,可以 關(guān)注 公眾號 點擊 在看 轉(zhuǎn)發(fā)

          瀏覽 61
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲变态另类 | 欧美色视频在线 | 欧美午夜精品久久久久 | 国产老妈操| 少妇高潮av久久久久久 |