我所遇見的坑(一)

2021-10-08 23:31:03 字數 2341 閱讀 2704

class father

;class children

};

真正的**要比這個複雜,例項化是巨集來呼叫的,所以我看了老半天,還是找不到**出錯了。因為用的codeblock,編譯過程中輸出的都是英文,沒有仔細看。後來看了vs編譯,發現有提示哪個虛函式沒有實現,這才想到看codeblock編譯輸出的結果。(這是乙個慘痛的教訓)

為了秉持追根到底的思想,特意去查了查const放在函式後面的作用。當然,既然介紹const,就把它的作用介紹全面。

修飾普通型別變數

const int a = 7;

int* p = (int*)(&a);

*p = 8;

這個很容易理解,就是a的值不能被改變。深層次我們除錯看下不同編譯器記憶體的結果,首先先看vs編譯器。

a的值記憶體上看到的是8,但是實際列印的時候是7。

下面來看g++編譯器:

編譯器行為一樣,都是記憶體看到的是8,實際列印的是7。

編譯器認為a的值是7,所以千萬不要輕易對const變數設法賦值,這會產生意想不到的行為。

如果不想讓編譯器察覺到上面對const的操作,我們可以在const前面加上volatile關鍵字。

volatile關鍵字跟const對應相反,是易變的,容易改變的意思。所以不會被編譯器優化,編譯器也就不會改變對a變數的操作。

以上引用來自於菜鳥教程

const本身就是不讓改變的,遵循這個規範即可。

const 修飾指標變數

總共有三種情況,

修飾指標所指向的內容的時候

const int* p = 8;

*p = 10; // error

int a = 10;

p = &a; // ok

可以看出,*p = 10 是錯誤的語法,但是將p指標重新指向另一塊記憶體是可以的。這種情況,const修飾的是右側的值是不可改變的。打個比喻,比如 p 是乙個小紙條,小紙條上用鉛筆寫著明天會下雨,你可以更改小紙條的內容,但是明天會下雨這個是不能改變的。(ps:這個比喻莫名有些恐怖的氣氛。。。)

修飾指標的時候

int a = 8;

int* const p = &a;

理解了第一種情況,第二種情況就容易理解了。還是打個比喻,p 是乙個小紙條,小紙條上用原子筆寫著你明天會遲到,小紙條上的內容沒有辦法修改,但是你可以明天早點起床,這樣你就不會遲到了。(ps:說可以修改小紙條的,請出門左走。畢竟這只是個語法規範,超出這個規範,一概不管)

同時修飾內容和指標『

int a = 8;

const int* const p = &a;

這種情況是第一種和第二種的結合體,理解第一第二種,這種情況自然理解了。還是依舊打個比喻,p 是乙個小紙條,紙條上用原子筆寫著明天會下雨,紙條上的內容沒有辦法改變,明天會下雨也沒有辦法改變。

const 修飾類成員函式

重頭戲來了

class test

void set(int a)

private:

int a;

};int main()

{ test t;

t.set(5);

cout如果不注釋 a = 10;編譯會報錯:

就好比,在逛街函式中,你只能看不能買。

如果有個成員函式想修改物件中的某乙個成員怎麼辦?這時我們可以使用 mutable 關鍵字修飾這個成員,mutable 的意思也是易變的,容易改變的意思,被 mutable 關鍵字修飾的成員可以處於不斷變化中

引用與菜鳥教程

一般情況,我們不會遇到這種需求。真要遇到了,查了查,用一用即可。

以後要遇見的坑

lst 1,2 for i in lst print lst 死迴圈 刪除列表的坑 lst 1,2,3,4 for i in lst lst.pop print lst 結果為 1,2 當i 為1的時候 刪除最後乙個元素4 i為2的時候刪除3 結束 lst 1,2,3,4 for i in lst ...

對GO切片的無知,我所踩下的坑

從切片中刪除指定元素 廢話不多說直接上 package main import fmt var datas int var filter int func init func main 從recordeddatas 刪除filter中的指定的元素 func filterdata recordedda...

eclipse整合ssh所遇見的問題

eclipse整合ssh完畢的情況下,啟動tomcat時遇見的錯誤與提交請求所遇見的錯誤,我總結了下,希望對你們有所幫助 1.ssh使用註解來進行依賴注入的時候,action層總報server層注入的物件為空,顯而易見,server層注入失敗,從而影響action層的呼叫為空!通過總結和收查總結有兩...