const的用法

一、C中:
1:
①const修饰一个全局变量,无论如何都无法修改变量的值;
②在C语言中如果const修饰一个局部变量,则只能通过指针变量来改变其值,c语言中局部const存储在堆栈区,只是不能通过变量直接修改const只读变量的值,但是可以跳过编译器的检查,通过指针间接修改const值;如修饰普通变量,代表只读的意思
const int a=100;//定义了一个只读变量 a 值为 100
以后在程序中,不能再给 a 赋值了
a=200;//错误的,a 只读

2:const 修饰指针
(1)、const char *str
意思是 str 指向的内存的内容不能通过 str 来修改
用来保护 str 指向的内存的内容
但是 str 的指向是可以改变的

(2)、char * const str
意思是 str 是只读的变量,str 不能指向别的地方,
但是 str 指向的内存的内容,是有可能可以修改的

(3)、const char * const str
str 不能指向别的地方,指向的内存的内容也不能通过 str 去修改

二、C++中:如果一个const仅仅用来把一个名字用一个值代
替(就像使用#define一样),那么该存储局空间就不必创建。
①const int constA = 10;int* p = (int*)&constA对变量类型严格要求,有const的要强转成无const的;
②对于修饰局部变量:操作系统会认为当前变量是不会被改变的,所以会将当前变量和值保存在符号常量表中
保存在符号常量表中之后,下次使用当前变量时,不会从原本变量的地址中取值,而是从符号常量表中取值,所以即使改变原本的地址的内容,使用变量时发现值还是没改。使用volatile修饰变量,表示当前变量时易变的,所以不会保存在符号常量表中
const volatile int a = 100;
③如果const修饰的变量保存的是一个变量,则不会讲变量保存在符号常量表中const int a = m;
④如果const修饰的变量的类型是构造数据类型(结构体、类…),则也不会保存在符号常量表中
const stu s1 = {100, 200, ‘w’};
stu *p = (stu *)&s1;
③与#define区别
1.const有类型,可进行编译器类型安全检查。#define无类型,不可进行类型检查. 2.const有作用域,而#define不重视作用域,默认定义处到文件结尾.如果定义在指定作用域下有效的常量,那么#define就不能用。
④常函数
常函数使用const修饰,并且要将const放在函数参数的后面
常函数无法修改普通的成员变量,只能读取数据
如果常函数中想要修改成员变量的值,当前成员变量必须使用 mutable修饰
⑤ 常对象
可以正常调用构造函数
const MyDemo m1 = MyDemo(10, 20, 30, 40);
常对象无法调用普通成员函数
常对象无法操作普通成员变量
常对象可以直接操作mutable修饰的公有的成员变量
常对象只能调用常函数
⑥、常量转换(const_cast)
该运算符用来修改类型的const属性
常量指针被转化成非常量指针,并且仍然指向原来的对象;
常量引用被转换成非常量引用,并且仍然指向原来的对象;
注意:不能直接对非指针和非引用的变量使用const_cast操作符去直接移除它的const.
void test3()
{
int *p = const_cast<int *>(&num);
*p = 888;
cout << "*p = " << *p << endl;
cout << "num = " << num << endl;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值