C到C++的升级
- const 在C中只是个“只读变量”,并不是真正意义上的常量,通过指针能改变它,如下
-
1 #include<stdio.h> 2 int main() 3 { 4 const int a=0;//声明只读变量a为0 5 int* p=(int*)&a;//给个指针指向a的空间 6 *p=100;//改变a的存储空间的内容 7 printf("a=%d",a);//a被更改为100 8 return0; 9 }
- const在C++中是真正意义上的常量,无法通过指针来改变
-
1 #include<iostream> 2 usingnamespace std; 3 int main() 4 { 5 const int a=0;//声明只读变量a为0 6 int* p=(int*)&a;//给个指针指向a的空间 7 *p=100; 8 cout<<a; 9 return0; 10 }
即使分配了空间也不会用存储空间里面的内容,只会使用符号表的值。
再举个例子:
1 constint a=10; 2 constint b=20; 3 int c[a+b];
上面的代码在C中会报错“无法确定数组长度”,因为在C中const只是个只读变量,本质上还是变量,有存储空间,定义数组长度用变量当然会出错了。
但在C++中却可以编译通过,因为C++对const做了加强,使得const是真正意义上的常量。
- const和#define的区别
-
1 #include<iostream> 2 usingnamespace std; 3 int f(){ 4 cout<<B<<endl; 5 } 6 int g(){ 7 #define N 3//只希望在这个函数中用N=3 8 constint a=100;// 希望在这个函数中用 a=100 9 } 10 #define B 1 11 int main() 12 { 13 cout<<N<<endl; 14 f(); 15 return0; 16 }
这个代码第4行会出错“[Error] 'B' was not declared in this scope”,B没有定义,说明#define编译前进行简单文本替换时,只替换#define 下面的所有,位于#define上面的则没有替换。
const 则由编译器处理,有作用域检查和类型检查
-
1 #include<iostream> 2 usingnamespace std; 3 int f(){ 4 constint a=100;//只希望a=100的作用域在f()中 5 } 6 } 7 int main() 8 { 9 cout<<a<<endl;//出错,没有定义a,因为a作用域只在f()中 10 return0; 11 }
#define可以用 #undef 限定作用域,不过有点麻烦:
-
1 int g(){ 2 #define 3 int a=10; 4 #undef 5 }
- C++对函数类型和参数的加强
- C++中三目运算可以返回变量(前提是a,b不能是常量!(a<b?1:5)=50;这个一看就是错的),而C中则不行(三目运算符(a<b ?a :b) 先判断问号左边是否为真,若为真执行a,否则执行b)
如:
-
1 int main() 2 { 3 int a=1; 4 int b=100; 5 (a<b?a:b)=50; 6 printf("%d %d",a,b); 7 }
但C中上述代码会出错,三目运算符不能返回变量。
Keep it simple, stupid.