C与C++在const用法上的区别
? ? ? ?首先,C和C++在大體結構上不同,卻在語法上相同。 ?所以在使用的時候,我們會時常遇到一些莫名其妙的問題,覺得語法上是正確的,但是編譯的時候卻出現一個紅色的 error! 比如今天我遇到的這個有意思的問題。
? ? ?1. 今天看到一段代碼,覺得很有意思:
1 #pragma warning(disable : 4090) 2 3 #include<stdio.h> 4 5 int main(int argv, char args []) { 6 7 const int var = 4; 8 int *p = &var; 9 *p = 1; 10 printf("%d\n",var); 11 getchar(); 12 }?答案很定不用說: ? ?1 ? ? ?原因也很簡單: ?C弱類型語言,C++是強類型語言。 ?p指針指向了var的地址,并將var的值改變!
但是,我們再看看,這個兩個代碼:
1 #include<iostream> 2 3 using namespace std; 4 5 int main(int args , char argv[]) { 6 7 const int var = 10; 8 std::cout << "var =" << var << std::endl; 9 // int * p= &var; --不能轉換,會報錯! 10 //可以使用強制轉換 11 int *p = (int *)&var; 12 *p = 3; 13 std::cout << "*p =" << *p << std::endl; 14 int num[var]; 15 16 int i = 0; 17 //初始化 18 for (auto data : num) { 19 data =++i; 20 std::cout<<"num["<<i-1<<"] =" << data << std::endl; 21 } 22 getchar(); 23 return 0; 24 }2. ?即便你用這個const_cast《》:強制去掉const屬性,但是*p=3,這條語句 ,p指向的地址的值任然沒有改變!這兩個代碼的值,都是這個:
1 #include<iostream> 2 3 using namespace std; 4 5 int main(int args , char argv[]) { 6 7 const int var = 10; 8 std::cout << "var =" << var << std::endl; 9 // int * p= &var; --不能轉換,會報錯! 10 //可以使用強制去掉const 屬性 11 int *p = const_cast<int *>(&var); 12 *p = 3; 13 std::cout << "*p =" << *p << std::endl; 14 std::cout << "var =" << var << std::endl; 15 int num[var]; 16 17 int i = 0; 18 //初始化 19 for (auto data : num) { 20 data =++i; 21 std::cout<<"num["<<i-1<<"] =" << data << std::endl; 22 } 23 getchar(); 24 return 0; 25 }?
結果
為:?? 我們可以看到,var的值,沒有改變! ?原因是C++是強類型語言,C++的數據的類型更加嚴格與苛刻 ! ?
? ?當然對于C++為何會出現指針的值為*p=3而var=10這樣的情況,其實,*P所指的常量地址真實的內存已經修改了,但是編譯器并沒有從內存地址中取值,而是直接從寄存器中取的值,所以var=10依舊表面上依舊沒有發生什么改變!
?
? ? ?2. ? 那么,對于指針而言呢? const 用到指針就會發揮大作用,可以設定權限,比如 ?int const * p ? / ?const int *p (這兩個其實可以看做是同一個類型)均為常量指針, 還有 int * const p 指針常量,還有const int ?* const p ?;
? ? ? ? 根據它們的特性 ?權限如下:
? ? ? ? ? ? int ?const *p ? ? ? ?-----只能讀,不能寫,既然是指向常量的指針,當然是可以指向其他常量的。
? ? ? ? ? ? int ?* ?const p ? ? -----能讀也能寫,但是既然是指針常量, 當然是不能指向其他地址,無法修改其他地址的值。
? ? ? int const * const p ? ?----能讀不能寫,而且無法指向其他地址的值。
? ? ? 這樣就可以設定權限,對于系統而言,這個是很安全而且很妥當的,還很power ! 當然還可以運用到指針函數什么的 ! 這樣const其實作用還是很有用初 的! ?特別是用在對安全要求很高的系統,比如銀行的系統什么的?
總結
以上是生活随笔為你收集整理的C与C++在const用法上的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS 7.0安装Nvidia驱动
- 下一篇: linux-telnet服务配置