c++中有了const,代替了c中的define,并且表现很好!
c中的预编译 :#define MAX 500 (必须放在文件的头部)
c++中的替代:const int MAX=500; (放置的位置满足作用域规则即可)
使用const 的好处:
1):可以明确的指定类型
2);可以运用c++中的作用域规则,将其限制在特定的函数或则文件中间
3);可以运用在更复杂的数据类型中间(比如数组,指针,结构等)
那么,麻烦也就来了!const int *p; int *const p; const int *const p;这三个兄弟当初老师讲课的时候听的晕晕乎乎!
现在又在书上遇到了这个东西,决定详细的说明一下!
1.const修饰的变量必须在一开始就赋初值,否则会报错!
const int i;
i=1;
i++;
cout <<i<< endl;
error: uninitialized const 'i' [-fpermissive]|
2,const修饰的变量一旦赋初值了就不能改变
const int i=1;
i++;
cout <<i<< endl;
error: increment of read-only variable 'i'|
3.当const修饰指针的时候,可以不用赋初值!并且,当形如const type * name的时候,该指针可以指向不同的地址
const int* i;
int j=1;
int k=1;
i=&j;
cout <<"this is j="<<j<< endl;
i=&k;
cout <<"this is k="<<k<< endl;
3.1当形如type *const name的时候,该指针必须一开始就赋初值,并且不应许改变!
int *const i;
int j=1;
int k=1;
i=&j;
cout <<"this is j="<<j<< endl;
i=&k;
cout <<"this is k="<<k<< endl;
error: uninitialized const 'i' [-fpermissive]|
int j=1;
int k=1;
int *const i=&j;
cout <<"this is j="<<j<< endl;
i=&k;
cout <<"this is k="<<k<< endl;
error: assignment of read-only variable 'i'|
4.不能将const变量的地址赋给常规指针,但是可以将const变量的地址赋给const指针
const int j=1;
int *i=&j;
cout <<"this is i="<<*i<< endl;
error: invalid conversion from 'const int*' to 'int*'
const int j=1;
const int* i=&j;
注意:在函数的参数中也是遵循这种规则!
要想源地址的值不想受调用函数的影响,就应该尽可能的使用const
这样做,可以避免由于无意间修改了数据而导致编程错误;
使用const使得函数能够处理const和非const实参,否则只能接受非const数据
最后再说明一下,cosnt type *name;和type * const name的区别
int a=2;
int b=3;
const int *p=&a;
*p=5;//error
p=&b;//ok
int a=2;
int b=3;
int *const p=&a;
*p=5;//ok
p=&b;//error