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