书法字典:https://www.shufadict.com

关于参数和返回值的常量性

为什么要将参数或者返回值设置为常量

什么时候参数应该是常量的?

什么时候返回值应该是常量的?

在回答这两个问题之前首先看一下为什么要将参数和返回值设置为常量?一句话,为了防止用户修改参数或者返回值

大多数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函数返回值类型,其实是原来的值的一个副本,改了也无所谓,所以不必设置为常量

引用类型和指针类型实际上多了一层间接性,不像值类型那样可以直接操作,更重要的是传递指针或引用能大大提高效率,如果直接传递对象本身,开销是很大的,但是这层间接性也导致了不安全性,通过指针或者引用可以修改目标的值,为了防止修改,所以能使用常量的地方尽量使用常量。

posted on   翰墨小生  阅读(1878)  评论(2编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述

导航

< 2010年7月 >
27 28 29 30 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
1 2 3 4 5 6 7
书法字典:https://www.shufadict.com
点击右上角即可分享
微信分享提示