const关键字
1、const和变量
const int a = 3;
在编译阶段,编译器就知道 a 这个变量是read-only的,不能被修改。
一旦试图修改就会报错
const 处于类型前还是类型后没有影响
const int a =3;
int const a =3;
//这两个是一样的
2、const和函数参数
如果我们不希望传入函数得参数被修改,可以用const
#include <iostream>
using namespace std;
void funcA(const int a)
{
a = 16;
}
int main()
{
int a = 1;
funcA(a);
return 0;
}
我们知道函数传参其实是传过去一个拷贝,所以const更多的会用于引用,指针等,不希望原来的数据被改变
#include <iostream>
using namespace std;
void funcA(const int* ptr)
{
(*ptr)++;
}
void funcB(const int& ref)
{
ref++;
}
int main()
{
int a = 1;
int* ptr = &a;
int&ref = a;
funcA(ptr);
funcB(ref);
return 0;
}
3、const和数组
直接限制了数组的所有元素,不能修改
#include <iostream>
using namespace std;
const int things[]={1,2,3,4,5,6,7,8};
int main()
{
things[1] = 0;
return 0;
}
4、const和结构体
const修饰的结构体的数据成员也是read-only
#include <iostream>
using namespace std;
typedef struct _aStruct{
int a;
int b;
}aStruct;
const aStruct someStruct={.a=1, .b=2};
int main()
{
someStruct.a=12;
return 0;
}
5、const和指针
const修饰指针有两种方式,
第一种是修饰指针指向的变量
int a =1;
const int* ptrA = &a;
int const * ptrB = &a;
//ptrA和ptrB不能修改a的值,但是可以改变ptrA和ptrB的指向
#include <iostream>
using namespace std;
int main()
{
int a =1;
int b =2;
const int* ptrA =&a;
int const * ptrB =&a;
*ptrA = 12;
*ptrB = 12;
ptrA = &b;
ptrB = &b;
return 0;
}
编译结果
第二种是修饰指针,限定指针的值(也就是指针指向的地址)不能改变
int a =1;
int* const ptrA = &a;
//ptrA永远只能指向a,不能指向别的地方,但是可以修改a的数据
#include <iostream>
using namespace std;
int main()
{
int a =1;
int b =2;
int* const ptrA = &a;
*ptrA = 12;
ptrA = &b;
return 0;
}
最简单的区分方法就是,经过 * 这个符号做一条垂直线,const在垂直线左边都是修饰变量的值,const在右边都是修饰地址的值。
6、const和#define的区别
•#define 是宏替换,在预编译的时候确定
•const 前面有数据类型,会进行数据类型检查
•#define 执行的宏名,可以通过#undef来取消宏定义,但是const修饰的变量,保存在静态区,会一直存在,所以如果你有多个头文件声明同一个const 变量,肯定会出现重复定义。但是你在两个头文件中,#define 两个名字一样的宏名,并不会有问题