const

首先是const  reference的使用,这部分内容已经在C语言里说过,但是在C++里又有了一些扩展。 

C++允许使用object作为参数传递,但是object有大有小。 比如下面一个object class

  1. class CBitmap{
  2. public:
  3.     CBitmap();
  4.     ~CBitmap();
  5. private:
  6.     const static UINT32 MAX_BUFFER_SIZE = 65536;
  7.     UINT32 m_Height;
  8.     UINT32 m_Width;
  9.     BYTE    m_Buffer[MAX_BUFFER_SIZE];
  10. };

如果我们有个函数,是DrawBitmap,那么就有两种不同的声明方式。
========
错误的方式========
void DrawBitmap(CBitmap Bitmap);
========
正确的方式
========
void DrawBitmap(CBitmap & Bitmap);
如果我们使用第一种方式,那么程序就会创建一个临时的CBitmap object,然后把Bitmap拷贝进去,传送给DrawBitmap。这可不是只会拷贝几个字节那么简单,而且CBitmap的所有内容,包括里边的m_Buffer都会拷贝。如果使用reference也就是 "&",就不会有任何操作。如果在DrawBitmap里边不会改变Bitmap的任何状态,也就是不会改变任何属性,那么就最好加上const关键字,最后的DrawBitmap的声明应该是:

void DrawBitmap(const CBitmap & Bitmap); 

这个时候,在DrawBitmap里,只能调用CBitmap中声明为const的函数。让我们来看看代码

  1. class CBitmap{
  2. public:
  3.     CBitmap();
  4.     ~CBitmap();
  5.     UINT32 GetHeight(voidconst;
  6.     void SetHeight(void);
  7. private:
  8.     const static UINT32 MAX_BUFFER_SIZE = 65536;
  9.     UINT32 m_Height;
  10.     UINT32 m_Width;
  11.     BYTE    m_Buffer[MAX_BUFFER_SIZE];
  12. };
  13. UINT32 CBitmap::GetHeight(voidconst
  14. {
  15.    return m_Height;
  16. }
  17. void CBitmap::SetHeight(UINT32 Height)
  18. {
  19.   m_Height = Height;
  20. }

大家看到了,在 UINT32 GetHeight(void) const; 有个const,意思是这个函数不会改变任何CBitmap里的属性值。由于SetHeight()会改变m_Height,所以不能声明为const. DrawBitmap里边,由于参数是const类型,所以只能调用const的方法。

  1. void DrawBitmap(const CBitmap & Bitmap)
  2. {
  3.     Bitmap.GetHeight();        // 正确,没有问题
  4.     Bitmap.SetHeight(100);   // 错误,Bitmap是const类型
  5. }

值得注意的是,尽量把class的声明中,不改变属性的方法,声明为 const ,这就是所谓的良好的程序风格。

最后,如果在CBitmap里边有另外一个类,比如是CNormalMap,那么如果有个方法用来取得CNormalMapcode如下

  1. class CBitmap {
  2. .....
  3. // 省略
  4. Private: 
  5.     CNormalMap NormalMap;
  6. public
  7.     CNormalMap GetNormalMap(void);
  8. }

这是一种类做法,但是并没有充分的考虑效率。首先,返回的CNormalMap不是引用,这个是正确的做法,对象拷贝以后,即使改变内容,也不会影响Class的状态。但是如果我们本来就不打算改变CNormalMap的状态呢?那么这个函数的调用效率就低下了,所以我们一般提供2个函数,代码如下:

  1. class CBitmap {
  2. .....
  3. // 省略
  4. Private: 
  5.     CNormalMap NormalMap;
  6. public
  7.     CNormalMap GetNormalMap(void);
  8.     const CNormalMap & GetStaticNormalMap(void);
  9. }

或者利用C++的函数重载,做如下声明:

  1. class CBitmap {
  2. .....
  3. // 省略
  4. Private: 
  5.     CNormalMap NormalMap;
  6. public
  7.     CNormalMap GetNormalMap(void);
  8.     const CNormalMap & GetNormalMap(voidconst;
  9. }

如果我们不打算改变NormalMap的状态,那么就掉用GetStaticNormalMap() 或者 GetNormalMap() const调用,这样我们可以充分的利用reference的效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值