你的c++学习路上明灯
最近事情还是比较多,我的心态也出现了一些小问题,目前也在积极的调整,想学的东西太多,但是又不是那么容易学,不可避免的产生了一些消极的态度,老师也是对我很好,帮助我调整状态,很快我也会慢慢的持续变好,我自己也相信自己。好了,开始我们今天的学习。
其实c++我们到了这里其实学的已经差不多了,还差后面的STL标准库,但是理论都差不多已经全部学完了,我们现在主要做的就是找到一些细节的地方然后去了解学习。
今天就开始做一期const的专题。
c++虽然采取了不少有效的措施(如private保护,类的封装等等)以增加数据的安全性,但是有些数据却是共享的,例如实参与形参,变量的与其引用,数据及其指针等人们可以在不同的场合通过不同的途径访问同一个数据对象。有时一些无意间的操作可能会造成变量的改变。
既要使数据能在一定范围内共享,又要保证它不能被任意修改,这是就可以把有关的数据定义为常量。
一,常对象
直接在定义对象时加关键字const,指定对象为常对象,常对象必须要有初值。
在该对象的生命周期中,对象中所有数据成员的值都不能被修改。凡是希望保证数据成员不被改变的对象,可以声明为常对象。
1.如果一个对象被声明为常对象,则通过该对象只能调用它的常成员函数,而不能调用该对象的普通成员函数(除了由系统自动调用的隐式的构造函数和析构函数)。常成员函数时常对象唯一的对外接口。
这是为了防止普通成员函数会修改常对象中的数据,就算普通成员函数中没有改变数据的操作,编译系统仍然不给通过。因为编译是以一个源程序文件为单位的,但是程序不一定只有一个源程序文件,即,函数的定义和声明不在一个源程序文件,就会造成麻烦,索性就直接不允许了。
2.常成员函数可以访问常对象中的数据成员,但仍然不允许修改常对象中的数据成员的值。
以上两点就保证了,常对象中的数据成员不会被改变。
3,但是有时候也会想让常对象中的某个数据成员的值改变,可以对该数据成员声明为mutable。
把该数据成员声明为可变的数据成员。
二,常对象成员
可以将对象的成员声明为const,包括常数据成员和常成员函数
1.常数据成员
只能通过构造函数的参数初始化表对常数据成员进行初始化,任何其他函数都不能对常数据成员赋值。
2,常成员函数
类型名 函数名(参数列表)const{}
const要在后面
在声明和定义的时候都要加const,调用的时候不用。
如果将成员函数声明为常成员函数,则只能引用本类中的数据成员,而不能修改它们,且常成员函数不能调用另一个非const成员函数。
三,指向对象的常指针
这个前面学过很多次了,不讲。
四,指向常对象的指针变量
1.如果一个变量已被声明为常变量,只能用指向常变量的指针指向它,不能用一般的指针变量去指向它。
2.指向常变量的指针变量除了可以指向常变量外,还可以指向未被声明为const的变量。此时不能通过此指针变量改变该变量的值。
char c1='a'; const char *p; p=&c1; *p='b';//错的 c1='b';//对的,没有通过p访问c1,c1不是常变量
指向常变量的指针常量可以指向一个非const变量。这是可以通过指针变量访问该变量,但不能改变该变量的值。如果不是通过指针变量访问,则变量的值是可以改变的。
**3.如果函数的形参是指向普通(非const)变量的指针变量,实参只能用指向普通变量的指针,而不能用指向const变量的指针,这样的话,就还是可以改变变量的值。