在使用STL中的vector时,我们能够清楚地感受到它的便利,也了解了它类似一个可变长的动态数组。vector提供了一个方法size(),通过它,我们可以清楚地知道当前vector对象的具体大小(含有多少个数据元素)。由此,我们不难发现,vector内部实现将表示具体大小的数据成员设为了私有,而通过一个公有方法去获取它的值。这是一个很好的办法,既保证了数据成员不会轻易被外部代码访问及修改,又提供了一种合法途径让我们能够知晓类内一些状态。但我们还能有另一种更好的选择:使用引用!
class Vector
{
private:
int _length;
protected:
public:
const int& length = this->_length;
Vector()
{
_length = 0;
}
Vector(int len)
{
_length = len;
}
void ChangeLen(int len)
{
_length = len;
}
};
上面是一段简单的模拟vector的代码,同样的,我将表示Vector对象具体大小的数据成员设为了私有,但我并未写一个方法去获取其值,取而代之的,我利用一个公有常引用,使其指向我所需要获取的数据成员。我们都知道,引用是一个变量的别名,所以这个常引用代表的就是表示Vector对象具体大小的数据成员,只是我为其加上了const限制,让其不能被改变。我们可以看出,这样的办法,或许将会比使用公有方法获取私有成员更简单,但也有很大隐患,我们可能一个疏忽,就将导致私有成员可以被轻易地随便更改!下面,再来看一段代码:
class Vector
{
private:
int _length;
protected:
public:
int& length = this->_length;
Vector()
{
_length = 0;
}
Vector(int len)
{
_length = len;
}
void ChangeLen(int len)
{
_length = len;
}
};
仔细一看,我们就发现,公有常引用变成了普通引用,这导致,如果我们改变了它的值,其对应的私有数据成员的值也随之改变,如果我们的初衷是私有数据成员值不可随意更改,那这就成了一个可怕的事实!或许,就在你的一个疏忽,少写了const!当然,这并不是完全没好处的,或许我们的设计初衷可以对某个私有数据成员进行更改,那此时普通引用既可以获取值又可以修改值。当然,我并不支持这样做,原因是,清楚地区分可更改与不可更改,能让我们在写代码时减少一些顾虑,增添一些条理。如遍历,我们的初衷是不改变值,那我们使用常引用,只要失误写出改值的代码,编译器就将报错,如此,我们就能更专注地倾注精力在实现上,而不是出了问题一步一步去查找问题所在!