共享数据的保护:
类很好地实现了数据的封装,通过隐藏保证了安全性。但上一节的友元函数及静态数据成员、静态函数则是在共享的过程中增加了数据改变的风险。那怎么能在共享时有效地保护数据。
而由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修饰则不会对实参修改。
实参为常对象或普通对象时,只能把对象视为常对象。