以下是在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修饰的变量是否可变化(个人观点)
int* const p=&a;
cout<<p<<endl;
cout<<*p<<endl;
int *p1=(int*)&p;
*p1=1;
cout<<p<<endl;
cout<<*p<<endl;
0
0x1
请按任意键继续. . .
int*p=(int*)&i;
*p=1;
cout<<i<<endl;
cout<<*(&i)<<endl;
cout<<*p<<endl;
cout<<"i"<<&i<<endl;
cout<<"p"<<p<<endl;
0
1
i0x28ff40
p0x28ff40
请按任意键继续. . .
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; )不会出错,
时间有限就研究到这里了= =累死