C++中关于类的公用数据保护

9.6.1 常对象

  • const指定对象为常对象,凡希望保证数据成员不被改变的对象可声明为常对象。
    定义常对象一般形式为: 类名 const 对象名[(实参表)];const 类名 对象名[(实参表)];
Time const t1(12,34,46);
  • 若一对象被声明为常对象,则只能通过该对象调用其常成员函数,而不能调用该对象普通成员函数,这是为了防止普通成员函数会修改常对象中数据成员的值。
const Time t1(10,15,36); 	//定义常对象t1
t1.get_time();			//试图调用常对象t1中的普通成员函数,非法!
  • 若要引用常对象中的数据成员,则将该成员函数声明为const即可。
void get_time()const;		//此时get_time为常成员函数
  • 常成员函数可以访问常对象中的数据成员,但仍不可修改常对象中数据成员的值。
  • 若一定要修改对象中的某个数据成员的值,则将该数据成员声明为mutable,之后便可用声明为const的成员函数来修改它的值。
mutable int count;		//将count声明为可变的数据成员

9.6.2 常对象成员

  1. 常数据成员
    ·用const来声明常数据成员,其值不能改变,只能通过构造函数的参数初始化表对常数据成员进行初始化,任何其他函数都不能对常数据成员赋值
    ·因常数据成员不能被赋值,所以不能采用在构造函数中对常数据成员赋初值的方法,若在类外定义构造函数,因这样写:
const int hour;			//在类体中定义常数据成员hour

Time::Time(int h):hour(h){}	//在类外通过参数初始化表对常数据成员hour初始化
  • 常成员函数
    ·声明常成员函数的一般形式为 类型名 函数名(参数表)const
    ·const是函数类型的一部份,在声明与定义函数时都要有此关键字。
    ·常对象只保证其数据成员是常数据成员,成员函数必须加const声明才为常成员函数
    ·常成员函数不能调用另一个非const成员函数
数据成员 非const的普通成员函数 const成员函数
非const的普通数据成员 可以引用,也可以改变值 可以引用,但不可改变值
const 数据成员 可以引用,但不可以改变值 可以引用,但不可以改变值
const对象 不允许 可以引用,但不可以改变值

9.6.3 指向对象的常指针

  • 将指针变量声明为const型,这样指针变量始终保持为初值,不能改变,即其指向不变。
    定义指向对象的常指针变量的一般形式 类名 * const 指针变量名;
Time t1(10,12,15),t2;		//定义对象
Time *const ptrl;			//const位置在指针变量名前面,指定ptrl是常指针变量
ptrl=&t1;					//ptrl指向对象t1,此后不能再改变指向
ptrl=&t2;					//错误,ptrl不能改变指向

Time *const ptrl=&t1		//在定义指针变量时使之初始化,合并上面2、3行
  • 指向对象的常指针变量的值不能改变,始终指向同一对象,但可改变其所指对象的值

9.6.4 指向常对象的指针变量

  • 定义指向常变量的指针变量的一般形式为 const 类型名 * 指针变量名
  • 如果一个变量已被声明为常变量只能用指向常变量的指针变量指向它,而不能用普通指针指向它。
const char c[]="boy";		//定义const型的char数组
const char * p1;			//定义p1为指向const型的char变量的指针变量
p1=c;						//合法,p1指向常变量(char数组的首元素)
char * p2=c;				//不合法,p2不是指向常变量的指针变量
  • 指向常变量的指针变量除可指向常变量,也可指向非常变量(普通变量),但不能通过此指针变量改变该变量值。
char c1='a';				//定义字符变量c1,它并未声明为const
const char *p;				//定义了一个指向常变量的指针变量p
p=&c1;						//使p指向字符变量c1
*p='b';						//非法,不能通过p改变变量c1的值
c1='b';						//合法,没有通过p访问c1,c1不是常变量
  • 用指针变量作形参时形参和实参的对应关系
形参 实参 合法否 改变指针所指向的变量的值
指向普通变量的指针 普通变量的地址 合法 可以
指向普通变量的指针 常变量的地址 非法 /
指向常变量的指针 常变量的地址 合法 不可以
指向常变量的指针 普通变量的地址 合法 不可以

猜你喜欢

转载自blog.csdn.net/weixin_44730560/article/details/89439437