網(wǎng)站怎么做qq登錄不知怎么入門
數(shù)組隱式轉(zhuǎn)換為指針
size_t func(int a[10]) {return sizeof(a);
}int a[100];
func(a); // 指針大小
sizeof(a); // 數(shù)組大小
函數(shù)的參數(shù)看似是一個數(shù)組形式,但事實上他已經(jīng)退化為指針了,也就是等價于size_t func(int* a)
,而數(shù)組作為參數(shù)傳遞給該函數(shù)時,也會隱式轉(zhuǎn)化為指針。
因此,上述函數(shù)的返回值是指針大小,而不是數(shù)組大小,多么反直覺呀(初出茅廬的我曾因此而犯錯)。
類型不是從左向右說明
int a;
int b[10];
a的類型是int,而b的類型是int[10]。到目前為止,我們還是能輕松的辨別變量的類型,不許驕傲,再看看下面的定義:
int *a[10];
int (*b)[10];
此時,是不是有點困惑,它們該是什么類型呢?
首先,a的類型是數(shù)組,長度為10,元素類型是int*;b的類型是指針,指向int[10]的數(shù)組。
你會發(fā)現(xiàn)它們的類型一會兒從右向左,一會兒從內(nèi)向外。反正就是非常的不直觀,我每次都能記住,但時間一長也就忘了,希望這次能記得久點。
類型的隱式轉(zhuǎn)換
這應(yīng)該算是最令人頭疼的問題之一了,如下的代碼也許大家都遇到過:
if (val = 2) {// 我能日賺斗金的邏輯
} else {// 我怎么實現(xiàn)一夜暴富
}
想必大家很容易就看到了val = 2
這行神奇的代碼了,那么它的神奇之處在哪呢?
首先,我們知道C++的賦值操作會返回該對象本身,所以這行神奇代碼的返回值就是val
,那么問題就顯而易見了,val
會隱式轉(zhuǎn)換為bool類型,因為值是2,所以永真,那么也就意味著,我不能實現(xiàn)一夜暴富了,只能老老實實日賺斗金了(其實也不錯,嘿嘿)。這就是賦值操作帶返回值以及隱式類型轉(zhuǎn)換帶來的問題。
這種錯誤我偶爾也會觸犯,一時難以發(fā)現(xiàn),最后發(fā)現(xiàn)了也只會令我更加痛苦(為啥會寫出如此愚蠢的bug),沒有一點成就感。
對地址的直接操作
C++的指針在使用上是何其的自由哇,有了指針,我覺得我就是造物主了,我能隨意操縱一切(苦笑)。實際上呢?自由操作指針也同樣帶來了巨大的風(fēng)險,請看下面代碼:
int* a = new int[10];
int* p = a;
// 一堆莫名其妙的邏輯
int b = *(p + 10);
這種錯誤一看就明白,但是工作中一寫代碼保不齊哪里就寫越界了,然后代碼運行前我們還察覺不到,你說氣人不氣人。所以還是要盡量避免直接操作裸指針,更應(yīng)該避免通過指針偏移來操作指針。
后置的自增自減
后置的自增和自減操作,雖然從直覺上來看,和前置的沒啥區(qū)別,都是讓自身的值+1/-1,然而實際的內(nèi)部實現(xiàn)上卻有著些許差異,但就是這種差異卻也會帶來性能上的損耗。
MyObject a;
a++; // 返回a自加前的副本
++a; // 返回a本身
我的對象是咋樣的就不在此展示了,直接說結(jié)論,后置的自增/自減,會返回一個自增/自減之前的副本,所以會存在一次額外的構(gòu)造和析構(gòu)操作。而前置的自增/自減則是返回該對象本身,所以沒有額外開銷。因此,有時候不經(jīng)意間寫了后置的自增/自減,就有可能導(dǎo)致軟件的性能降低。
總結(jié)
很明顯,我對C++的思考僅限于C++語言本身,至于其他語言我很少涉及,因此,不能夠通過與其他語言的對比中,發(fā)現(xiàn)C++更多的不足。因為不知道別人有多好,所以我總以為C++給予我的就是它最好的,但事實上它也有很多缺陷。當然,一切相遇都是最好的安排,既然選擇了C++,那它就是最好的,不忘初心(學(xué)好C++),方得始終。