常对象和常成员其实与常量的概念很接近,都是不可更改初始化值,但由于是在涉及到类,所以操作这些数据变得有点复杂,有很多需要注意的地方!
因为这方面的内容涉及到指针,所以先在这里回顾以前所学的指向常量的指针和指针常量。
const int *p; //指向整型常量,指针值可改(可指向其它整形常量),但不可以修改指针指向对象的值。
int * const p; //指向整型量的常指针,可通过*p修改对象的值(指向对象为非常量的情况),但指针值不可修改。
//所以一般定义常指针时便进行初始化,int *const p=&a;
指向常量的指针和指针常量还有常量其实挺好理解的,但接下来写的常对象和常成员相比就复杂得许多。
(在这之前先补充下指向对象的指针定义形式: Student *pt=&stud1;)
① 常对象定义的一般形式:
类名 const 对象名 (实参列表);
const 类名 对象名 (实参列表); //二者等价。
常对象的性质:常对象里的所有数据成员都不可修改值(除了在类中已经声明了为可变量的数据成员),且只能通过类中常函数访问。
②常数据成员定义的一般形式:
数据类型 const 常量名;
const 数据类型 常量名; //二者等价。
常数据成员的性质:
其值不可以被赋值,只能在调用对象时运行构造函数是用初始化的方式进行初始化赋值(只能用:类名 ::类名(形参列表):常量名(),.............{}这种方式进行初始化)。可以被const函数和非const函数引用。
③常成员函数定义的一般形式:
数据类型 函数名() const; //const的位置在括号后面。
并且在类体外定义函数时也要在后面加const。
常成员函数的性质:
可以访问同类中的常数据成员和非常数据成员,还有常对象的数据成员,但不可以改变其值。
④静态数据成员定义的一般形式:
static 数据类型 变量名;
静态数据成员的初始化:
静态数据成员只允许在类外进行初始化,形式为: 数据类型 类名::静态数据成员名=初值;
静态数据成员的性质:
静态数据的值是可变的,并且让同类对象共用,静态数据存储不在对象中,单独开辟的空间,方便同类对象共用,
静态数据成员的引用:
可通过类名和对象名进行引用,形如:cout<<a.height; cout<<Box::height; //假设height已经声明为静态数据成员。两种引用方式等价。
⑤静态成员函数定义的一般形式:
在类中声明: static 数据类型 函数名();
在类外定义时只需用一般形式,不必加sconst。
静态成员函数的性质:
静态成员函数是类的一部分,不存储在对象中,但可以同过类名和对象名调用函数,且在静态成员函数可以直接引用同类中的静态数据成员,
不用加类名或者对象名,但应为静态成员函数没有this指针,所以引用非静态数据成员时需要加对象名。