C++說(shuō)愛(ài)你不容易-2
C++軟件與嵌入式軟件面經(jīng)解析大全(蔣豆芽的秋招打怪之旅)
本章講解點(diǎn)
- 1.1 C++與C的區(qū)別——看看你的理解是否深刻
- 1.2 從代碼到可執(zhí)行文件的過(guò)程
- 1.3 extern "C"
- 1.4 宏——到底是什么
- 1.5 內(nèi)聯(lián)函數(shù)
- 1.6 條件編譯
- 1.7 字節(jié)對(duì)齊詳解
- 1.8 Const——今天必須把它搞懂
- 1.9 Static作用
- 1.10 volatile和mutable
- 1.11 volatile在嵌入式里的應(yīng)用
- 1.12 原子操作
- 1.13 指針與引用的區(qū)別
- 1.14 右值引用
- 1.15 面向?qū)ο蟮木幊趟枷?
- 1.16 類(lèi)
- 1.17 類(lèi)的成員
- 1.18 友元函數(shù)
- 1.19 初始化列表
- 1.20 this指針
- 1.21 繼承
- 1.22 多態(tài)
- 1.23 虛函數(shù)與重寫(xiě)
- 1.24 虛構(gòu)造函數(shù)與虛析構(gòu)函數(shù)
- 1.25 函數(shù)重載
- 1.26 操作符重載
- 1.27 迭代器與指針
- 1.28 模板
- 1.29 C++智能指針
- 1.30 四種cast轉(zhuǎn)換
- 1.31 Lambda
- 1.32 function和bind
受眾:本教程適合于C/C++已經(jīng)入門(mén)的學(xué)生或人士,有一定的編程基礎(chǔ)。
本教程適合于互聯(lián)網(wǎng)、嵌入式軟件求職的學(xué)生或人士。
故事背景
蔣 豆 芽:小名豆芽,芳齡十八,蜀中人氏。卑微小碩一枚,科研領(lǐng)域茍延殘喘,研究的是如何炒好一盤(pán)豆芽。與大多數(shù)人一樣,學(xué)習(xí)道路永無(wú)止境,間歇性躊躇滿(mǎn)志,持續(xù)性混吃等死。會(huì)點(diǎn)編程,對(duì)了,是面對(duì)對(duì)象的那種。不知不覺(jué)研二到找工作的時(shí)候了,同時(shí)還在忙論文,豆芽都禿了,不過(guò)豆芽也沒(méi)頭發(fā)啊。
隔壁老李:大名老李,蔣豆芽的好朋友,技術(shù)高手,代碼女神。給了蔣豆芽不少的人生指導(dǎo)意見(jiàn)。
導(dǎo) 師:蔣豆芽的老板,研究的課題是每天對(duì)豆芽噓寒問(wèn)暖。
故事引入
“中國(guó)土豆科技大學(xué)一研三學(xué)生因論文壓力太大,跳樓輕生,家長(zhǎng)指責(zé)導(dǎo)師故意延畢?!倍寡繉⑦@條新聞推送到了微信朋友圈,并配文:默哀。我也壓力好大啊。
導(dǎo) 師:(試探)豆芽,你這實(shí)驗(yàn)盡力做就行了,你也別壓力大,慢慢來(lái)嘛。
蔣 豆 芽:老師,我壓力好大啊,也想把實(shí)驗(yàn)做出來(lái),不然辜負(fù)了您的一片諄諄教導(dǎo)。
導(dǎo) 師:不用壓力大,周末好好休息下,實(shí)驗(yàn)慢慢做就行了。
蔣 豆 芽:好的?。ǘ寡磕樕闲ξ?,心里小感動(dòng),老師蠻好的。實(shí)驗(yàn)要繼續(xù)加油?。?/p>
蔣 豆 芽:(吹著口哨)我得兒意的笑,我得兒意的笑。。。。。。
隔壁老李:?jiǎn)眩寡?,什么事啊這么開(kāi)心,不用搞實(shí)驗(yàn)了?
蔣 豆 芽:別介,老李。我回顧你上次跟我講的宏,在C++中,盡量使用const去替代非參數(shù)宏命令,這樣大大增強(qiáng)我們程序的健壯性。我今天在思考,const是什么樣的機(jī)制呢,為什么可以做到不變?還有,const有哪些應(yīng)用場(chǎng)景呢?
隔壁老李:(嘖嘖嘖)喲,芽別三日,當(dāng)刮目相待啊,開(kāi)始學(xué)會(huì)思考知識(shí)點(diǎn)了,沒(méi)錯(cuò),找工作中,面試只是一個(gè)過(guò)程,這不僅僅是應(yīng)試,學(xué)知識(shí)不是應(yīng)付找工作,而是真正提升自己的技術(shù)能力,學(xué)會(huì)思考知識(shí)點(diǎn)背后的原理,掌握知識(shí)點(diǎn)的核心,才是找工作給予我們的最大的啟示。(語(yǔ)重心長(zhǎng))憑這一點(diǎn),豆芽,你成熟了,不枉為父諄諄教導(dǎo)。
蔣 豆 芽:老李,說(shuō)話(huà)就說(shuō)話(huà),別占我便宜好嗎?
隔壁老李:(嘿)哈哈。哦?不想聽(tīng)啊,不想聽(tīng)算了唄。
蔣 豆 芽:爸爸!
隔壁老李:哈哈,好啦,跟你開(kāi)玩笑的。今天我們先來(lái)聊聊const,說(shuō)const之前,我們要先說(shuō)說(shuō)常量,什么是常量呢?
常量是一種標(biāo)識(shí)符,它的值在運(yùn)行期間恒定不變。C語(yǔ)言和C++中都可以用#define來(lái)定義常量(稱(chēng)宏常量)。除此之外,C++語(yǔ)言還可以用const來(lái)定義常量(稱(chēng)const常量),就是我們今天要說(shuō)到的主角了。那么豆芽我問(wèn)問(wèn)你,我們?yōu)槭裁葱枰A浚?/p>
蔣 豆 芽:這個(gè)我還真沒(méi)想過(guò),我只知道有這個(gè)東西,但為什么要用就不知道了。
隔壁老李:(語(yǔ)重心長(zhǎng))所以我們的學(xué)習(xí)不能僅僅停留在這個(gè)地步,不僅要知其然,還要知其所以然,凡事多問(wèn)幾個(gè)為什么,就會(huì)引申出很多的知識(shí)。
蔣 豆 芽:老李,我發(fā)現(xiàn)你越來(lái)越像我高中班主任了。
隔壁老李:(好奇)哦?是講解細(xì)致入微?
蔣 豆 芽:不,是啰里啰嗦了。
隔壁老李:(敲腦袋)呸,死豆芽懂什么啊,那都是為你好!等你以后就知道班主任的好了。我不僅在教你編程知識(shí),還在教你怎樣正確編程。
蔣 豆 芽:(捂腦袋)好,老李,你繼續(xù)吧。
隔壁老李:豆芽,你想想你平時(shí)編寫(xiě)程序時(shí),直接填充數(shù)字會(huì)遇到什么問(wèn)題?
蔣 豆 芽:(恍然大悟)哦,修改的時(shí)候特別麻煩,過(guò)幾天再來(lái)看,就忘了這個(gè)數(shù)字什么意思了。
隔壁老李:所以啊,如果我們?cè)诔绦蛑兄苯犹畛鋽?shù)字或字符串,
(1)程序的可讀性(可理解性)變差。我們總會(huì)忘記這些數(shù)字或字符串代表什么意義。
(2)一旦數(shù)字很多,改動(dòng)麻煩。
為了避免這些問(wèn)題,我們就要用常量來(lái)替代。豆芽,之前我已經(jīng)跟你說(shuō)過(guò)了,在C語(yǔ)言中,可以使用宏替代常量,而C++盡量使用const常量替代宏常量,豆芽你來(lái)回顧一下。
1.8 Const——今天必須把它搞懂
蔣 豆 芽:簡(jiǎn)單!const 是 constant 的縮寫(xiě),本意是不變的,不易改變的意思。在 C++ 中是用來(lái)修飾內(nèi)置類(lèi)型變量,自定義對(duì)象,成員函數(shù),返回值,函數(shù)參數(shù)。
C++ const 允許指定一個(gè)語(yǔ)義約束,編譯器會(huì)強(qiáng)制實(shí)施這個(gè)約束,允許程序員告訴編譯器某值是保持不變的。如果在編程中確實(shí)有某個(gè)值保持不變,就應(yīng)該明確使用const,這樣可以獲得編譯器的幫助。
在C++中為了安全性,我們就要少用甚至不要再用宏了,不帶參數(shù)的宏命令我們可以用常量const來(lái)替代,比如const double PI = 3.1415
,可以起到同樣的效果,而且還比宏安全,因?yàn)檫@條語(yǔ)句會(huì)在編譯階段進(jìn)行語(yǔ)法檢查。而宏常量在預(yù)編譯階段被替換,不會(huì)進(jìn)行語(yǔ)法檢查。
蔣 豆 芽:(疑惑)那老李,C語(yǔ)言里也有const,為什么C語(yǔ)言里的常量用的是宏而不是const?
隔壁老李:誒?這個(gè)問(wèn)題問(wèn)的非常得好啊,豆芽??礃幼幽阌性谡J(rèn)真聽(tīng)哈。
蔣 豆 芽:必須的!
隔壁老李:這是因?yàn)?strong>C語(yǔ)言里的const和C++里的const,兩者作用機(jī)制是不一樣的。這也是個(gè)比較重要的知識(shí)點(diǎn),老李記得曾經(jīng)被面試官這樣問(wèn)過(guò),當(dāng)時(shí)老李沒(méi)有回答出來(lái)(羞澀)
蔣 豆 芽:嘿嘿。
隔壁老李:在C語(yǔ)言中,const修飾的變量依然被當(dāng)做變量,那么其在內(nèi)存中依然有存儲(chǔ)它的空間。并且可以通過(guò)指針間接的改變?cè)搩?nèi)存空間的值。如下面例子所示:
#include <stdio.h> int main(){ const int i = 10; int *p = (int *)(&i); *p = 20; printf("i=%d *p=%d \n", i, *p); return 0; }
結(jié)果如下:
i=20 *p=20
這里可以清楚地看到,i
的值被改變了。
蔣 豆 芽:啊?那這樣就違背了我們定義const的初衷了。
隔壁老李:沒(méi)錯(cuò),所以這就是為什么在C語(yǔ)言中表示常量,使用的是宏常量而非const。宏是直接替換。
蔣 豆 芽:(好奇)那C++的const機(jī)制又是怎樣的呢?
隔壁老李:在C++中,C++把const看做常量,編譯器會(huì)使用常數(shù)直接替換掉上面例子中對(duì)i
的引用,最后的結(jié)果是i = 10,*p = 20
。
#include<iostream> using namespace std; int main(){ const int i = 10; int *p = (int *)(&i); *p = 20; cout << "i=%d" << i << "*p=%d" << *p; //這里編譯器會(huì)直接將i替換為10 return 0; }
這里需要說(shuō)明的是,其實(shí)變量i
的內(nèi)存空間里的數(shù)值依然已經(jīng)被改變了,為20。
所以千萬(wàn)不要輕易對(duì) const 變量設(shè)法賦值,這會(huì)產(chǎn)生意想不到的行為。
蔣 豆 芽:明白了!所以C++中的const機(jī)制類(lèi)似C語(yǔ)言中的宏,都是替換,不過(guò)C++的const是在編譯階段替換,C語(yǔ)言的宏是在預(yù)編譯階段替換。
隔壁老李:沒(méi)錯(cuò)!豆芽,趕緊把小筆記記起來(lái)啊,這就是標(biāo)準(zhǔn)答案啊,面試官最喜歡問(wèn)了。然后我們要把const講透,const還有其他的用法,const可以修飾指針。
隔壁老李:在定義指針的時(shí)候我們可以用const來(lái)修飾
根據(jù)const出現(xiàn)的位置和出現(xiàn)的次數(shù)分為三種
指向常量的指針
常指針
指向常量的常指針
1.指向常量的指針
指針指向一個(gè)常量對(duì)象,目的是防止使用該指針來(lái)修改指向的值。
如:
const int *a; //a指針?biāo)赶虻膬?nèi)存里的值不變,即(*a)不變,但a可以變 int const *a; //同const int *a;
給出實(shí)例:
int a = 10; int b = 20; const int *p = &a; //該聲明的意思是p指向一個(gè)const int(這里為10),因此不能使用p來(lái)修改這個(gè)值, //換句話(huà)來(lái)說(shuō),*p的值為const,不能被修改。 *p = 20; //錯(cuò)誤,編譯報(bào)錯(cuò) p = &b; //正確,const只能防止修改p指向的值,但不能防止修改p的值,也就是說(shuō),可以將一個(gè)新地址賦給p
2.常指針
將指針本身聲明為常量,這樣可以防止改變指針指向的位置。
如:
int *const a; //a指針?biāo)赶虻膬?nèi)存地址不變,即a不變,但(*a)可以變
給出實(shí)例:
int a = 10; int b = 20; int *const p = &a; //意思是p只能指向a,p不能變,但允許p來(lái)修改a的值。 *p = 20; //正確,a的值可以被修改 p = &b; //錯(cuò)誤,編譯報(bào)錯(cuò),p不能被修改
3.指向常量的常指針
一個(gè)常量指針指向一個(gè)常量對(duì)象。
如:
const int *const a; //都不變,即(*a)不變,a也不變
隔壁老李:const可以修飾參數(shù)傳遞。
對(duì)于 const 修飾函數(shù)參數(shù)可以分為三種情況。
A:值傳遞的 const 修飾傳遞,一般這種情況不需要 const 修飾,因?yàn)楹瘮?shù)會(huì)自動(dòng)產(chǎn)生臨時(shí)變量復(fù)制實(shí)參值,實(shí)參反正不會(huì)變。但是我們也可以加const,這是一種良好的風(fēng)格。
#include<iostream> using namespace std; void douya(const int a){ cout<<a; // ++a; 是錯(cuò)誤的,a 不能被改變 } int main(void) { douya(8); system("pause"); return 0; }
B:當(dāng) const 參數(shù)為指針時(shí),可以防止指針被意外篡改。
#include<iostream> using namespace std; void douya(int *const a){
剩余60%內(nèi)容,訂閱專(zhuān)欄后可繼續(xù)查看/也可單篇購(gòu)買(mǎi)
<p> - 本專(zhuān)刊適合于C/C++已經(jīng)入門(mén)的學(xué)生或人士,有一定的編程基礎(chǔ)。 - 本專(zhuān)刊適合于互聯(lián)網(wǎng)C++軟件開(kāi)發(fā)、嵌入式軟件求職的學(xué)生或人士。 - 本專(zhuān)刊囊括了C語(yǔ)言、C++、操作系統(tǒng)、計(jì)算機(jī)網(wǎng)絡(luò)、嵌入式、算法與數(shù)據(jù)結(jié)構(gòu)等一系列知識(shí)點(diǎn)的講解,并且最后總結(jié)出了高頻面試考點(diǎn)(附有答案)共近400道,知識(shí)點(diǎn)講解全面。不僅如此,教程還講解了簡(jiǎn)歷制作、筆試面試準(zhǔn)備、面試技巧等內(nèi)容。 </p> <p> <br /> </p>