c++里的const

一、三种用法
1.const int *p; //锁定指针指向内存空间值
eg:
int a=10,b=5;
const int *p;
p=&a;
*p=20; //编译错误原因:指针指向内存空间值为定值
结果:1>e:程序 est est源.cpp(8): error C3892: “p”: 不能给常量赋值


2.int * const p; //锁定指针值(即指针的指向不能改变)
eg:
int a=10,b=5;
int *const p=&a; //注意:指针值为定值时需要给指针赋初值
p=b; //编译错误原因:指针值为定值
结果:1>e:程序 est est源.cpp(7): error C3892: “p”: 不能给常量赋值

3.const int *const p; //既锁定指针值,又锁定指针指向内存空间值
eg:
int a=10,b=5;
const int *const p=&a;
p=&b; //编译错误原因:指针值为定值
*p=20; //编译错误原因:指针指向内存空间值为定值
结果: 1>e:程序 est est源.cpp(8): error C3892: “p”: 不能给常量赋值
1>e:程序 est est源.cpp(8): error C3892: “p”: 不能给常量赋值

二、c与c++中const的不同(c是冒牌货)
c里的const定义常量可以通过指针指向改变指针指向空间的值
c++里的const定义常量被放在符号区,当有指针指向时会在内存重新划分空间并复制。原变量不改变,但可以改变指针指向空间值
eg:
c编译器里
#include <iostream>
using namespace std;
void main()
{
const int a=10;
int *p=&a;
*p=20;
cout<<a<<endl;
system("pause");
}
运行结果为20(此时输出指针值也为20,指针与变量代表同一块内存空间)
c++编译器里
#include <iostream>
using namespace std;
void main()
{
const int a=10;
int *p=(int *)&a;
*p=20;
cout<<a<<endl;
system("pause");
}
运行结果为10;(此时输出指针值为10,指针指向的空间是后来复制在内存空间的,此时变量值储存在符号区,是个定值)
结论:c里的const可以通过指针修改变量值,是冒牌货,c++里不行.

三、const与#define的不同
#define在预编译阶段就执行,是简单的文本替换,作用域是整个文件,可在后面取消文本替换(即缩小作用域):用undef结束文本替换
const定义变量在编译阶段开始执行内存划分,作用域一般为变量作用域。
eg:
#include <iostream>
using namespace std;
void f1();void f2();
void main()
{
f2();
system("pause");
}
void f1()
{
#define a 10
const int b=20;
}
void f2()
{
cout<<a<<endl;
cout<<b<<endl; //编译错误原因:此时b的作用域只在函数f1里,a的作用域是整个文件
}
结果:error C2065: “b”: 未声明的标识符

问题:此时如何缩小a的作用域?
void f1()
{
#define a 10
const int b=20;
#undef a; //取消a的预编译文本替换即可
}

原文地址:https://www.cnblogs.com/MrQlyn/p/10236361.html