若在全局区定义则是相同的,下面是C与C++中const在局部的不同
C语言中的const
#include<stdio.h>
int main()
{
int const a = 8;
int *p = &a; //warning C4090: “初始化”: 不同的“const”限定符
//a = 10; //直接修改会提示错误error C2166: 左值指定 const 对象
*p = 100; //但间接修改可行
printf("a=%d", a);
return 0;
}
- 上述代码在.c文件下,编译时
- 警告:warning C4090: “初始化”: 不同的“const”限定符
- 第6行错误:error C2166: 左值指定 const 对象
- 第6行注释掉后:========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========
- 【结论1】.c文件中const不可直接修改,可间接修改
//demo.c文件中
//#include"demo.cpp" 可不用包含
int main()
{
extern const int a;
printf("a = %d",a);
}
//test.c文件中
const int a = 10;
- 【结论2】c语言中const默认是外部链接属性
C++中的const
#include<stdio.h>
int main()
{
int const a = 8;
int *p = &a; //error C2440: “初始化”: 无法从“const int *”转换为“int *”
a = 10; //error C3892: “a”: 不能给常量赋值
*p = 100;
printf("a=%d", a);
return 0;
}
- 同样的代码,将文件后缀名由.c改为.cpp
- 第5行错误:error C2440: “初始化”: 无法从“const int *”转换为“int *” note: 转换丢失限定符
- 第6行错误:error C3892: “a”: 不能给常量赋值
- ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
- 无法生成可执行文件。C++比C对const的要求更加严格
//demo.cpp文件中
#include"demo.cpp" //必须包含
int main()
{
extern const int a;
cout << a;
}
//test.cpp文件中
const int a = 10; //不行需要写 extern const int a = 10;
- 【结论】c++中const默认是内部链接属性
const分配内存(可通过指针间接修改)的情况
-
const变量取地址
-
加关键字extern
-
用变量初始化const修饰的变量
-
自定义数据类型
const常见用法举例
#include <iostream>
using namespace std;
#define X 3 //宏定义,编译时计算机不检查语法错误
int main()
{
// int const a=3; //const int a=3;
// const int *p=&a;//int const *p=&a; p可变,*p内容不可变
int const b=5;
// int *const q =&b;//q不可变,*q内容可变
// const int *const q =&b;//q不可变,*q不可变
int const *p = &b;
// int const &c=b; //c不可被赋值,b可被赋值
// c=1;
// b=3;
// a=5;
// *q=4;
// p=&b;
// cout << a << c << *p << endl;
return 0;
}
- 1) const在前面
const int nValue; //nValue是const
const char *pContent; //*pContent是const, pContent可变
const (char *) pContent; //pContent是const,*pContent可变
char* const pContent; //pContent是const,*pContent可变
const char* const pContent; //pContent和*pContent都是const
- 2) const在后面,与上面的声明对等
int const nValue; // nValue是const
char const * pContent;// *pContent是const, pContent可变
(char *) const pContent;//pContent是const, *pContent可变
char* const pContent;// pContent是const, *pContent可变
char const* const pContent;// pContent和*pContent都是const
- 看懂const :看const后紧跟的是什么?如果是指针变量,则指针变量不允许修改;如果是指针变量所指向的值,则值不允许修改