C语言和C++中const的不同之处

若在全局区定义则是相同的,下面是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后紧跟的是什么?如果是指针变量,则指针变量不允许修改;如果是指针变量所指向的值,则值不允许修改

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值