面試真題 | 小米智能座艙
自我介紹
介紹項(xiàng)目
static關(guān)鍵字,在類里面使用呢?
問(wèn)題回答:static關(guān)鍵字在類里面的使用
在C++中,static
關(guān)鍵字在類里面有多種用途,主要包括靜態(tài)成員變量和靜態(tài)成員函數(shù)。以下是詳細(xì)解釋:
靜態(tài)成員變量
-
定義與聲明:
- 靜態(tài)成員變量在類內(nèi)聲明,但在類外定義和初始化。它不屬于類的任何對(duì)象,而是屬于類本身。
- 聲明時(shí)使用
static
關(guān)鍵字,如static int count;
。 - 定義時(shí)在類外,如
int ClassName::count = 0;
。
-
存儲(chǔ)位置:
- 靜態(tài)成員變量存儲(chǔ)在全局?jǐn)?shù)據(jù)區(qū),而不是對(duì)象的內(nèi)存空間中。
- 因此,所有對(duì)象共享同一個(gè)靜態(tài)成員變量的值。
-
訪問(wèn)方式:
- 可以通過(guò)類名和作用域解析運(yùn)算符
::
來(lái)訪問(wèn)靜態(tài)成員變量,如ClassName::count
。 - 也可以通過(guò)對(duì)象來(lái)訪問(wèn),但這不是推薦的做法,因?yàn)樗赡芤l(fā)誤解。
- 可以通過(guò)類名和作用域解析運(yùn)算符
-
用途:
- 常用于計(jì)數(shù)、記錄類的實(shí)例數(shù)量、作為類內(nèi)部的全局變量等。
靜態(tài)成員函數(shù)
-
定義與聲明:
- 靜態(tài)成員函數(shù)在類內(nèi)聲明時(shí)使用
static
關(guān)鍵字,如static void display() {}
。 - 它不屬于類的任何對(duì)象,因此不能訪問(wèn)非靜態(tài)成員變量或非靜態(tài)成員函數(shù)(除非通過(guò)對(duì)象指針或引用傳遞)。
- 靜態(tài)成員函數(shù)在類內(nèi)聲明時(shí)使用
-
調(diào)用方式:
- 可以通過(guò)類名和作用域解析運(yùn)算符
::
來(lái)調(diào)用靜態(tài)成員函數(shù),如ClassName::display()
。 - 也可以通過(guò)對(duì)象來(lái)調(diào)用,但同樣不是推薦的做法。
- 可以通過(guò)類名和作用域解析運(yùn)算符
-
參數(shù)傳遞:
- 由于靜態(tài)成員函數(shù)不能訪問(wèn)非靜態(tài)成員,如果需要訪問(wèn),通常通過(guò)參數(shù)傳遞對(duì)象指針或引用。
-
用途:
- 常用于實(shí)現(xiàn)與類相關(guān)的功能,但不依賴于特定對(duì)象的狀態(tài)。
- 如工廠函數(shù)、工具函數(shù)等。
面試官追問(wèn)及相關(guān)回答
追問(wèn)1:
- 問(wèn)題:靜態(tài)成員變量和靜態(tài)成員函數(shù)與普通成員變量和成員函數(shù)的主要區(qū)別是什么?
- 回答:
- 存儲(chǔ)位置不同:靜態(tài)成員變量存儲(chǔ)在全局?jǐn)?shù)據(jù)區(qū),而普通成員變量存儲(chǔ)在對(duì)象的內(nèi)存空間中。
- 訪問(wèn)方式不同:靜態(tài)成員變量和成員函數(shù)可以通過(guò)類名直接訪問(wèn),而普通成員變量和成員函數(shù)只能通過(guò)對(duì)象來(lái)訪問(wèn)。
- 生命周期不同:靜態(tài)成員變量在程序運(yùn)行時(shí)一直存在,直到程序結(jié)束;而普通成員變量的生命周期與對(duì)象的生命周期相同。
- 作用域不同:靜態(tài)成員變量和成員函數(shù)的作用域是整個(gè)類,而普通成員變量和成員函數(shù)的作用域是類的實(shí)例。
追問(wèn)2:
- 問(wèn)題:在嵌入式系統(tǒng)中使用靜態(tài)成員變量和靜態(tài)成員函數(shù)有哪些需要注意的地方?
- 回答:
- 注意內(nèi)存使用:由于靜態(tài)成員變量存儲(chǔ)在全局?jǐn)?shù)據(jù)區(qū),如果大量使用靜態(tài)成員變量,可能會(huì)導(dǎo)致內(nèi)存占用過(guò)多。
- 避免多線程沖突:在多線程環(huán)境中,如果多個(gè)線程同時(shí)訪問(wèn)同一個(gè)靜態(tài)成員變量,需要采取同步措施來(lái)避免數(shù)據(jù)競(jìng)爭(zhēng)。
- 謹(jǐn)慎使用靜態(tài)成員函數(shù)訪問(wèn)非靜態(tài)成員:雖然可以通過(guò)參數(shù)傳遞對(duì)象指針或引用來(lái)訪問(wèn)非靜態(tài)成員,但這會(huì)增加函數(shù)的復(fù)雜性和出錯(cuò)的可能性。因此,在設(shè)計(jì)類時(shí),應(yīng)盡量避免在靜態(tài)成員函數(shù)中訪問(wèn)非靜態(tài)成員。
追問(wèn)3:
- 問(wèn)題:能否給出一個(gè)使用靜態(tài)成員變量和靜態(tài)成員函數(shù)的實(shí)際例子?
- 回答:
這個(gè)例子展示了如何使用靜態(tài)成員變量來(lái)記錄類的實(shí)例數(shù)量,并使用靜態(tài)成員函數(shù)來(lái)顯示該數(shù)量。class Counter { public: // 靜態(tài)成員變量,用于記錄類的實(shí)例數(shù)量 static int count; // 構(gòu)造函數(shù),每次創(chuàng)建對(duì)象時(shí)增加計(jì)數(shù) Counter() { count++; } // 析構(gòu)函數(shù),每次銷毀對(duì)象時(shí)減少計(jì)數(shù) ~Counter() { count--; } // 靜態(tài)成員函數(shù),用于顯示當(dāng)前計(jì)數(shù) static void displayCount() { std::cout << "Current count: " << count << std::endl; } }; // 在類外定義和初始化靜態(tài)成員變量 int Counter::count = 0; int main() { Counter obj1, obj2; Counter::displayCount(); // 輸出:Current count: 2 Counter* obj3 = new Counter(); Counter::displayCount(); // 輸出:Current count: 3 delete obj3; Counter::displayCount(); // 輸出:Current count: 2 return 0; }
智能指針?
智能指針回答
問(wèn)題:請(qǐng)解釋一下C++中的智能指針,并詳細(xì)討論其種類、工作原理以及使用場(chǎng)景。
回答:
智能指針是C++中用于自動(dòng)管理動(dòng)態(tài)分配內(nèi)存的一種機(jī)制,它通過(guò)封裝原始指針并提供對(duì)資源的自動(dòng)釋放,從而避免了內(nèi)存泄漏和懸空指針等問(wèn)題。C++標(biāo)準(zhǔn)庫(kù)提供了幾種主要的智能指針,包括std::unique_ptr
、std::shared_ptr
和std::weak_ptr
。
-
std::unique_ptr:
- 獨(dú)占所有權(quán)的智能指針,不允許復(fù)制,只能移動(dòng)。
- 當(dāng)
unique_ptr
被銷毀或離開(kāi)作用域時(shí),它所指向的對(duì)象也會(huì)被自動(dòng)刪除。 - 適用于需要確保只有一個(gè)所有者管理資源的場(chǎng)景。
-
std::shared_ptr:
- 共享所有權(quán)的智能指針,允許多個(gè)
shared_ptr
實(shí)例共享同一個(gè)對(duì)象。 - 使用引用計(jì)數(shù)機(jī)制來(lái)管理對(duì)象的生命周期,當(dāng)最后一個(gè)
shared_ptr
被銷毀或重置時(shí),對(duì)象會(huì)被自動(dòng)刪除。 - 適用于多個(gè)所有者需要共享資源的場(chǎng)景,但需要注意循環(huán)引用的問(wèn)題。
- 共享所有權(quán)的智能指針,允許多個(gè)
-
std::weak_ptr:
- 弱引用,用于解決
shared_ptr
之間的循環(huán)引用問(wèn)題。 - 不會(huì)增加對(duì)象的引用計(jì)數(shù),因此不會(huì)延長(zhǎng)對(duì)象的生命周期。
- 可以從
shared_ptr
或另一個(gè)weak_ptr
創(chuàng)建,但不能直接訪問(wèn)對(duì)象,必須通過(guò)lock()
方法獲取shared_ptr
來(lái)臨時(shí)訪問(wèn)對(duì)象。
- 弱引用,用于解決
工作原理:
unique_ptr
通過(guò)其析構(gòu)函數(shù)來(lái)釋放資源,當(dāng)unique_ptr
對(duì)象被銷毀時(shí),它會(huì)調(diào)用delete
來(lái)釋放其所指向的對(duì)象。shared_ptr
使用控制塊(通常包含引用計(jì)數(shù)和指向?qū)嶋H對(duì)象的指針)來(lái)管理對(duì)象的生命周期。當(dāng)shared_ptr
被復(fù)制或賦值時(shí),控制塊會(huì)被共享,引用計(jì)數(shù)會(huì)增加。當(dāng)shared_ptr
被銷毀或重置時(shí),引用計(jì)數(shù)會(huì)減少。當(dāng)引用計(jì)數(shù)變?yōu)?時(shí),控制塊和對(duì)象都會(huì)被釋放。weak_ptr
不直接管理資源,而是指向shared_ptr
的控制塊。它不會(huì)增加引用計(jì)數(shù),因此不會(huì)阻止shared_ptr
所管理的對(duì)象被銷毀。
使用場(chǎng)景:
unique_ptr
適用于需要確保資源獨(dú)占所有權(quán)的場(chǎng)景,如動(dòng)態(tài)數(shù)組、單例模式等。shared_ptr
適用于多個(gè)所有者需要共享資源的場(chǎng)景,如對(duì)象圖、樹(shù)形結(jié)構(gòu)等。但需要注意避免循環(huán)引用。weak_ptr
通常與shared_ptr
一起使用,用于解決循環(huán)引用問(wèn)題,或在不增加引用計(jì)數(shù)的情況下觀察對(duì)象的狀態(tài)。
面試官追問(wèn)及回答
追問(wèn)1:
- 問(wèn)題:請(qǐng)解釋一下
std::make_unique
的作用,以及為什么推薦使用它而不是直接使用new
來(lái)創(chuàng)建unique_ptr
? - 回答:
std::make_unique
是一個(gè)模板函數(shù),用于創(chuàng)建并初始化一個(gè)unique_ptr
。它接受與new
相同的參數(shù),并返回一個(gè)unique_ptr
對(duì)象。- 推薦使用
std::make_unique
而不是直接使用new
來(lái)創(chuàng)建unique_ptr
的原因有幾個(gè):std::make_unique
更加簡(jiǎn)潔和直觀,它直接返回unique_ptr
,而不需要顯式地調(diào)用new
。std::make_unique
是異常安全的。如果構(gòu)造函數(shù)拋出異常,它不會(huì)泄漏內(nèi)存,因?yàn)?code>new表達(dá)式和unique_ptr
的構(gòu)造函數(shù)是作為一個(gè)原子操作執(zhí)行的。- 使用
std::make_unique
可以避免潛在的內(nèi)存泄漏問(wèn)題。如果直接使用new
來(lái)創(chuàng)建對(duì)象,然后再將其地址賦給unique_ptr
,在賦值過(guò)程中如果發(fā)生異常,可能會(huì)導(dǎo)致內(nèi)存泄漏。而std::make_unique
則保證了在異常發(fā)生時(shí)不會(huì)泄漏內(nèi)存。
追問(wèn)2:
- 問(wèn)題:在
shared_ptr
和unique_ptr
之間如何選擇?請(qǐng)給出一些具體的選擇依據(jù)。 - 回答:
- 在選擇
shared_ptr
和unique_ptr
時(shí),需要考慮資源的所有權(quán)和管理方式。 - 如果資源只需要被一個(gè)所有者管理,并且不希望其他代碼能夠訪問(wèn)或共享這個(gè)資源,那么應(yīng)該選擇。
- 在選擇
剩余60%內(nèi)容,訂閱專欄后可繼續(xù)查看/也可單篇購(gòu)買(mǎi)
讓實(shí)戰(zhàn)與真題助你offer滿天飛?。?! 每周更新?。?! 勵(lì)志做最全ARM/Linux嵌入式面試必考必會(huì)的題庫(kù)。 勵(lì)志講清每一個(gè)知識(shí)點(diǎn),找到每個(gè)問(wèn)題最好的答案。 讓你學(xué)懂,掌握,融會(huì)貫通。 因?yàn)榧夹g(shù)知識(shí)工作中也會(huì)用到,所以踏實(shí)學(xué)習(xí)哦!?。?/p>