C++——常对象成员和常对象 – 作者:Johnson666

前言

静态成员的使用让类的对象之间能够共享数据,友元的使用破坏了类的封装性,却给了类的“朋友”对本类成员访问的特权。但是,有时候要求数据在能共享的前提下还不能被修改,也就是要实现数据的保护。常变量就是使程序运行过程中值不能被改变,同样也可以让对象具有这样的特性。

常成员变量

在类的成员定义中,使用修饰符const说明的成员变量称为常成员变量。常成员变量必须初始化,并且不能被修改,它是通过构造函数的成员初始化列表进行初始化的。

例子:
常成员变量的应用:

#include<iostream>

using namespace std;

class A
{
public:
	A(int i);
	void Print();
private:
	const int a;
};

A::A(int i):a(i){}

void A::Print()
{
	cout << a << endl;
}

int main()
{
	A a1(50),a2(30);
	a1.Print();
	a2.Print();
	return 0;
}

结果:
image.png
构造函数A带有一个int型参数i,a(i)表示用i的值初始化常成员变量a,不能再对该常成员变量进行修改,即以下形式是错误的:
A::A(int i){a=i;} //任何通过成员函数对a进行的修改操作都是错误的

常对象

常成员变量能够保证某个成员变量在程序运行过程中不被修改,若希望所有的成员变量都不被修改,则可以将对象声明为常对象。成员变量的值在整个生存期内不能被改变的对象称为常对象(也称为const对象),常对象必须进行初始化,而且不能被更新。

声明常对象的语法形式为:
类名 const 对象名; //或const 类名 对象名
例如,有如下类的声明:

class A
{
public:
    A(int i,int j){x=i;y=j;}
    void setValue(int i,int j){x=i;y=j;}
private:
    int x,y;
};

以下语句中定义常对象a和普通对象b,调用对象b的setValue函数修改成员变量是正确的,但是调用常对象a的setValue函数则是错误的,C++规定不能通过常对象调用普通成员函数。

A const a(3,4);A b;
b.setValue(1,2);  //正确
a.setValue(1,2);  //错误

也就是说,如果一个对象被定义成常对象,那么不能调用该对象的普通成员函数,系统隐含调用的构造函数和析构函数除外。因为成员函数有可能修改成员变量,而成员函数的定义可能和成员函数的声明不在同一文件,系统没发检测。所以系统只能统一拦截,不让用户调用常对象的普通成员函数。
注意:有时因为编程的需要,必须要修改常对象中的某个成员变量的值,例如某个计数器变量count,可以将其声明为mutable:

mutable int count;
即将count声明为可变的成员变量,可以用声明为const的成员函数来修改它的值。

常成员函数

既然常对象无法调用普通成员函数,那常对象中的成员变量该如何使用呢?做法是将该成员函数声明为const类型,即常成员函数(也称为const成员函数)。方法为:
函数返回类型 函数名(参数表列) const;
例如:
void setValue(int i,int j)const; //将函数声明成const类型

常对象和常成员函数的应用:

#include<iostream>

using namespace std;

class Circle
{
private:
	double radius;
public:
	Circle(double r = 0)  //类的构造函数
	{
		radius = r;
	}
	double GetR1()const  //定义常成员函数
	{
		return radius;
	}
	double GetR2()  //非const成员函数
	{
		return radius;
	}
};

int main()
{
	const Circle R1(2.5);  //定义常对象R1
	Circle R2;  //定义普通对象R2
	cout << "The radius of R1 is " << R1.GetR1() << endl;  //常对象调用常成员函数
	cout << "The radius of R2 is " << R2.GetR2() << endl;  //普通对象调用非const成员函数
	return 0;
}

{
private:
double radius;
public:
Circle(double r = 0) //类的构造函数
{
radius = r;
}
double GetR1()const //定义常成员函数
{
return radius;

来源:freebuf.com 2021-06-16 22:05:29 by: Johnson666

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论