学习之路——类型修饰符const的探究

本文详细解析了C++中const关键字的多种用途,包括修饰基本类型、指针及在类中的应用,并通过实例展示了如何正确使用const来提高代码质量和安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下是在C++环境中的结果

1.const修饰的对象

①const  type valname 或type const valname   type型常量valname,不可修改其值

②const type *valname 或 type const  *valname  *valname不可修改,即不可通过valname指针修改它指向的数据。但是可修改它的指向

③ type *const valname    type型常量valname指针   不可以修改其 指向,但可通过本指针修改它指向的数据

④const type *const valname  valname  指针本身不可修改指向,且不可通过指针修改其指向的内容

(若是* +const ,感觉要判断cons修饰的是什么 只要看它后面跟的是不是指针名,若是指针名则说明他修饰的是此指针)

const修饰的变量是否可变化(个人观点)

事实上const修饰的对象之所以不能修改是编译器的功劳,当我们试图去修改const修饰的对象时,编译器便会报错,因此说const修饰的对象不可修改,但是我们可以不直接修改const修饰的对象,而通过它的内存地址修改它值,这样做编译器便不能发现我们的动作= =不会报错,从而达到修改const修饰对象的值得目的。
int a=0;
int* const p=&a;
cout<<p<<endl;
cout<<*p<<endl;
int *p1=(int*)&p;
*p1=1;
cout<<p<<endl;
cout<<*p<<endl;
运行结果为:0x28ff44
0
0x1
请按任意键继续. . .
由结果可知const指针p的指向的确改变了,它指向了地址0x1,运行出错无法打印它指向的内容(只有3个输出)
要注意的是当const修饰的是char,int等变量(例:const char ch)而不是指针变量时,会出现常量折叠问题,即 即使我们修改了const变量的地址里的值当编译时const变量的值仍然不变,这是因为在编译时编译器会生成一张符号表,而const常量的值会被保存在表内,在用到它时直接就用它的值代替了(就和#define N 10一样,用到N时就用10代替了),因此虽然我们改变了其内存里的值,但并没有改变用到的const常量的值。
const int i=0;
int*p=(int*)&i;
*p=1;
cout<<i<<endl;
cout<<*(&i)<<endl;
cout<<*p<<endl;
cout<<"i"<<&i<<endl;
cout<<"p"<<p<<endl;
        运行结果:0
0
1
i0x28ff40
p0x28ff40
请按任意键继续. . .
由结果可知:虽然const常量内存值改变了,但是const常量值本身没变。

2.const在类中的使用

一下面一段代码为例:
...

class a

{
private:
int x;
public:
a(int i)
{
x=i;
}
  void show()const
{
cout<<x<<endl;
}
void change(int i)
{
x=i;


};

...

若定义:const a p;此时p为常量,其所有数据都不得发生改变,前面我们说过,const实现其修饰对象是通过编译时实现的,那么编译器怎么知道类的方法有没有改变其数据呢?就是通过将其方法设为const修饰, 则此时p可访问类中所有const方法(即函数后面带有const的方法),在此例中可访问show()方法,但是不能访问change()方法,那么能不能把change()也设为const型呢?答案是否定的,因为在change()方法中有对类数据的修改,因此若将其设为const型时,编译器便会报错,以上是const在类中最基础的用法。

要注意:1.const加在函数的前面表示的是此函数的返回值为const型

2.因为const的实现靠的是编译器,在使用const修饰服时要时刻站在编译器的角度思考,我们的动作会不会对const常量造成修改,

如:const int *p;

int *a=p;

其中是指向const常量的指针,因此我们不能把一个const常量的地址赋值给一个变量,int *a=p;会编译出错,

又如:  a*   const   c   =   new   a(1);   
  a*   b   =   c;   最终结果是b指向了新开辟的a对象,但a对象不是const型因此不会出错,但若是将a*   const   c   =   new   a(1);   改为const a*   const   c   =   new   a(1);便会出错   

但是若是将const常量赋值给普通同类型对象时,因为我们知道"="符号赋值时,是先将右边的对象复制(即新建一份)一份,再将复制的对象赋值给左边,因为2个对象没有联系不会相互影响,所以:(const a p(1);a q=p;)||(const int b=0;int a=b;)||(int* const p=&a;int*b=p; )不会出错,

时间有限就研究到这里了= =累死


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值