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層的呼叫為空!通過總結和收查總結有兩...