为什么要将参数或者返回值设置为常量
什么时候参数应该是常量的?
什么时候返回值应该是常量的?
在回答这两个问题之前首先看一下为什么要将参数和返回值设置为常量?一句话,为了防止用户修改参数或者返回值
大多数SetXXX()函数的参数都应该是常量性的,因为我们要设置某个值,不需要改变参数,只需将其赋值给要修改的值即可
而大多数的GetXXX()函数的返回值都应该是常量性的,因为我们只想得到某个值,而不想改变它
还需要注意的一点就是,只有指针或者引用类型才有必要设置为常量性,对于值类型,没有必要,因为传值时传进去的/或者返回的是一个副本,改变副本并不会影响原来的值,所以值类型没有必要设置为常量,当然设置了也不算错。
如何将参数或者返回值设置为常量
C#中有属性,可以通过属性暴露私有成员,但是C++中没有属性,所以只能用GetXXX和SetXXX来实现,其实本质都一样。防止用户直接操作私有成员。看下面的Sphere类,这是一个标准的Get/Set的写法
class Sphere
{
public:
Sphere(void):m_vCenter(0.0f, 0.0f, 0.0f),m_fRadius(0.0f){}
Sphere(D3DXVECTOR3& center, float radius):m_vCenter(center), m_fRadius(radius){}
const D3DXVECTOR3& GetCenter() const
{
return m_vCenter ;
}
void SetCenter(const D3DXVECTOR3& center)
{
m_vCenter = center ;
}
float GetRadius() const
{
return m_fRadius ;
}
void SetRadius(float radius)
{
m_fRadius = radius ;
}
private:
D3DXVECTOR3 m_vCenter ; // Center of the sphere
float m_fRadius ; // Radius of the sphere
};
解释一下
1. 类的成员函数如果不修改类的成员,如上面的GetRadius和GetCenter函数,那么将该函数设置为const函数
2. SetCenter函数的参数是引用类型,为了防止用户修改该参数,将其设置为常量
3. SetRadius函数的参数是值类型,由于是传值,所以不会改变原来的值,不必设置为常量
4. GetCenter函数返回引用类型,为了防止用户修改返回值,所以将返回值设置为常量
5. GetRadius函数返回值类型,其实是原来的值的一个副本,改了也无所谓,所以不必设置为常量
引用类型和指针类型实际上多了一层间接性,不像值类型那样可以直接操作,更重要的是传递指针或引用能大大提高效率,如果直接传递对象本身,开销是很大的,但是这层间接性也导致了不安全性,通过指针或者引用可以修改目标的值,为了防止修改,所以能使用常量的地方尽量使用常量。