C++学习笔记(二)
本文將主要介紹const關鍵字的使用。
首先,說一下const是什么: const修飾的數據類型是指常類型,常類型的變量或對象的值是不能被更新的。
然后,我們來看一下這四處聲明:
const int a = 1; //code1 const int *p = &a; //code2 int * const p = &a; //code3 const int * const p = &a; //code4下面就具體說一下這四行代碼的作用與區別。
code1最簡單,即聲明a初值為1,且為常量,其值不可更改;
code2即將變量a的地址賦值給p,此時輸出*p的值為1,而且若進行*p = 2會報錯,也就意味著p所指向的值(a的值)是不可更改的;
code3因為const修飾的變量是p,同code1,也就意味著p存儲的值(變量a的地址,也就是p指向的地址)是不可更改的,若進行p = &b會報錯;
code4綜合code2 code3即可得出結論,p指向的地址和p指向變量的值都是不可更改的。
指針和const
現在,我們再來看一下指針與const結合使用時的微妙之處。
首先通過一個題來引出這部分內容:
/*僅通過一行代碼來使程序的最后輸出為2018*/const int a = 2017;//此處填入一行代碼cout << a << endl;剛看到這里,可能會用疑惑,前面不是剛說了a是const int類型,值不能修改嗎?
其實,還是因為我們的理解不深入,說的其實是不可以直接對const類型的值進行修改,但數據就在內存中放著,難道我們就只能眼睛看著,而沒有任何辦法嗎?當然不是,此刻,神奇的指針又該出場了,通過指針間接修改a的值。我們可以通過指針找到變量a的內存空間,在內存中對a的值進行修改。
即 *((int *)&a) = 2018;,這樣,就會在最終輸出時輸出2018。
因為上述代碼用到了強制類型轉化,所以在這里再說一下,C++是不允許將const類型轉化為非const類型的,因為如果:
const int x = 10; int *p = &x;通過上面的討論,我們已經知道到了x的值時const類型,不可被更改,然而將x的地址賦給p,卻可以通過指針輕易的修改x的值,這就使得x的狀態很荒謬。但要是必須這樣做,只能通過強制類型轉化來實現。
/*僅通過一行代碼來使程序的最后輸出為2018*/const int a = 2017;*((int *)&a) = 2018; //此處填入一行代碼cout << a << endl;PS:如果數據類型本身并不是指針,則可以將const數據或非const數據的地址賦給指向const的指針,但只能將非const數據的地址賦給非const指針。
總結
以上是生活随笔為你收集整理的C++学习笔记(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 摩尔庄园手游蟹黄果怎么获得
- 下一篇: 稻香家味剧情介绍