①常引用
形式—— const 类型 &对象名或变量名
②常对象
形式——const 类名 对象名
1.常对象的数据成员不能被修改了,在定义的时候应该对其进行初始化
2.常对象不能够调用普通成员函数——因为普通成员函数可能会修改对象的数据类型,这是不安全的。
3.常对象可以调用静态成员函数,常成员函数,其实也可以调友元函数 (但是这里不对每一个具体展开了,就只是为了更加明白常对象是不能调用普通的成员函数的即可)
③常成员函数
形式——返回值类型 方法名(参数表)
1.常成员函数不能改变对象的值,也不能在函数体里面调非常成员函数。
2.常对象可以调常成员函数和静态成员函数
3.常成员函数实现的时候,函数头是应该和声明的函数头一致的,const也是函数类型的一个组成部分,而对于友元函数和静态成员函数是不用friend和static的
4.非常对象也可以调用常成员函数,但是当常成员函数与非常成员函数同名的时候(可以视为函数重载),对于非常对象是会优先调用非常成员函数的。
④常数据成员
形式——const 数据类型 变量名;
(当同时还是静态数据成员的时候)static const 数据类型 变量名;
1.常数据成员的初始化只能通过构造函数的列表来完成
class CPoint
{
public:
CPoint(int xx, int yy,int zz);
private:
int x,y;
const int z;
};
CPoint::CPoint(int xx, int yy, int zz) :z(zz)
{
x = xx;
y = yy;
//z = zz; 这个是不被允许的,因为会报赋值号左侧必须是可修改的左值(可修改,有数据存储空间)
}
2.但是静态的常数据成员必须在类外进行初始化,不能在构造函数中进行,并且const不能省
class CPoint
{
public:
CPoint(int xx, int yy,int zz);
private:
int x,y;
static const int z;
};
const int z = 10; //const不能省,也是类型的一部分