c和c++的區別之const
阿新 • • 發佈:2018-12-19
1.const
C++:
在c++中,const定義的是常量,該常量的值是不可以被修改的,編譯時期
該使用該常量的地方直接替換成該常量的值,當然,常量是必須初始化的。
因為編譯時期,使用該常量的地方必須替換成該常量的值,若沒有初始化,
則此常量就是無用的常量
const修飾的資料產生的符號是local的,因為在編譯時期就會替換常量的值,
此過程只在本檔案中進行,外檔案是無法解析此檔案的常量
C語言:
在c語言中const定義的是常變數
下面用程式碼演示一下C和C++在const的區別:
#include<stdio.h> int main1() { const int a = 10; int *p = &a; *p = 20; printf("*p = %d a = %d\n", *p, a); //20 20 return 0; }
這是在c語言裡面定義的常變數,其結果 *p = 20,a = 20;
#include<iostream>
using namespace std;
int main()
{
const int a = 10;
int *p = (int *)&a;
*p = 20;
cout << *p << " " << a << endl; //20 10
return 0;
}
這是在C++裡面定義的常量,其結果*p = 20;a = 10;在編譯時期用到a常量的時候直接替換成10,所以不管如何改變*p的值都不會影響a的值
在編譯時期不能確定常量值的時候c++中的常量就會退化成常變數
int c = 20; const int d = c;//退化成常變數 int *p2 = (int *)&d; *p2 = 30; cout << *p2 << " " << d <<" "<<c <<endl; //30 30 20 因為c是變數,所以d的值是無法確定的,所以d退化成了常變數 void fun(const int a) //退化成常變數 { int *p = (int *)&a; *p = 30; cout << *p << " " << a << endl; // 30 30 } const作為形參也會退化成常變數 int main() { fun(10); return 0; }
const的基本用法:
const修飾的是離它最近的完整型別
const修飾的內容是它修飾型別的內容
const修飾的內容不容許修改
不允許洩漏常量的地址給非常量的指標
int main()
{
int b = 10;
int *p1 = &b;
const int *p2 = &b;
int *const p3 = &b;
int *q1 = &b;
const int *q2 = &b;
int *const q3 = &b;
q1 = p1; int * -> int * //ok
q1 = p2; const int * -> int * //error 洩漏常量的地址給非常量
q1 = p3; int * const -> int * //ok
q2 = p1; int * -> const int * //ok
q2 = p2; const int * -> const int * //ok
q2 = p3; int * const -> const int * //ok
q3 = p1; //error,
q3 = p2; //error
q3 = p3; //error, p3被const直接修飾,則它的值不允許被修改
return 0;
}
這些基本上就是c和c++關於const區別的用法,望與君共勉……