共享数据的保护:

  类很好地实现了数据的封装,通过隐藏保证了安全性。但上一节的友元函数及静态数据成员、静态函数则是在共享的过程中增加了数据改变的风险。那怎么能在共享时有效地保护数据。

而由C语言的知识我们知道往往设定常量来防止数据被更改,在C++中也同样有常量的概念。

常对象:

  常对象的数据成员在对象的整个生存期间内都不能改变,且必须要初始化。

 

  语法声明: const 类型说明符 对象名;

class A {
public:
	A(int i,int j):x(i),y(j){}
private:
	int x,y;
};           
const  A a(3,4)

常成员函数:

  Const修饰的函数为常成员函数。     语法声明:类型说明符  函数名(参数表)const

注:1.通过常对象只能调用它的常成员函数,这就是常对象唯一的对外接口方式。

    2.常成员函数不能更新目的对象的数据成员,与第一点也是相互照应。

    3.const关键字还可以进行重载函数的区分。

 

#include <iostream>
using namespace std;

class R {
public:
	R(int r1,int r2):r1(r1),r2(r2){}
	void print();
	void print() const;
private:
	int r1, r2;
};
void R::print() {
	cout << r1 << ":" << r2 << endl;
}
void R::print()const {
	cout << r1 << ";" << r2 << endl;    //为下文伏笔
}

int main()
{
	R a(5, 4);
	a.print();
	const R b(20, 52);
	b.print();       //此处调用的是带const的函数
	return 0;        //结果为5:4  20;52
	system("pause");
}

常数据成员:

  若类中说明了常数据成员,那函数不能在通过调用改变它的值。

#include <iostream>
using namespace std;

class A {
public:
	A(int i);
	void print();
private:
	const int a;                       //常数据成员的说明
	static const int b;                //说明一个类的静态常量
};
const int A::b = 10;                   //静态常量若是整数或枚举类型,则如此直接声明

A::A(int i) :a(i) {}
void A;; print() {
		cout << a << ":" << b << endl;
}
int main() {
	A a1(100), a2(0);
	a1.print();
	a2.print();
	return 0;
}

常引用:

  const 类型说明符 &引用名;函数声明时用const修饰则不会对实参修改。

  实参为常对象或普通对象时,只能把对象视为常对象。