代码之家  ›  专栏  ›  技术社区  ›  Tony The Lion

何时在函数参数中使用const和const引用?

  •  20
  • Tony The Lion  · 技术社区  · 14 年前

    当编写一个C++函数,它有传递给它的ARG时,如果可以保证对象不变,或者指针不变,则应该始终使用我的理解const。

    例如,什么时候使用const引用,与仅仅通过指针传递它相比有什么好处?

    这个怎么样 void MyObject::Somefunc(const std::string& mystring) 如果一个字符串实际上已经是一个不可变的对象,那么拥有一个常量字符串有什么意义呢?

    4 回复  |  直到 6 年前
        1
  •  41
  •   Roger Pate Roger Pate    14 年前

    询问是否添加const is 错误的问题, 不幸的是。

    比较非常量引用与传递非常量指针

    void modifies(T &param);
    void modifies(T *param);
    

    这个案子主要是关于风格的:你想让电话看起来像 call(obj) call(&obj) ? 然而,有两点不同很重要。如果希望能够传递null,则必须使用指针。如果重载运算符,则不能使用指针。

    void doesnt_modify(T const &param);
    void doesnt_modify(T param);
    

    这是个有趣的案例。经验法则是“廉价复制”类型按值传递这些类型通常是小类型(但并不总是),而其他类型由const ref传递。但是,如果需要在函数中复制,则 should pass by value . (是的,这暴露了一些实现细节。 最好的C++。 )

    比较常量指针与非修改加重载

    void optional(T const *param=0);
    // vs
    void optional();
    void optional(T const &param); // or optional(T param)
    

    这与上面的非修改情况有关,只是传递参数是可选的。这三种情况之间的差别最小,所以选择哪一种让你的生活更轻松。当然,非常量指针的默认值由您决定。

    Const by value是一个实现细节

    void f(T);
    void f(T const);
    

    这些声明实际上是 完全一样的功能! 传递值时,const纯粹是一个实现细节。 Try it out:

    void f(int);
    void f(int const) {/*implements above function, not an overload*/}
    
    typedef void C(int const);
    typedef void NC(int);
    NC *nc = &f;  // nc is a function pointer
    C *c = nc;  // C and NC are identical types
    
        2
  •  4
  •   Björn Pollex    14 年前

    一般规则是,使用 const 常量 可能使编译器能够优化并帮助您的对等方理解您的代码打算如何使用(并且编译器将捕获可能的误用)。

    至于你的例子,字符串在C++中不是不可变的。如果你手上拿着- 对函数的字符串引用,函数可以修改它。C++没有内置到语言中的不可变概念,只能使用封装来仿真它。 常量

    在考虑了@Eamons的评论和阅读了一些内容之后,我同意优化并不是使用 . 主要原因是要有正确的代码。

        3
  •  3
  •   Cheers and hth. - Alf    14 年前

    这些问题是基于一些错误的假设,因此没有实际意义。

    std::string 不为不可变字符串值建模。它为可变值建模。

    不存在“常量引用”这样的东西。有人提到 const

    顶层 常量 对于函数参数,它只对函数实现有意义,而对纯声明没有意义(编译器忽略了它)。它什么也没告诉打电话的人。这只是对实现的限制。例如。 int const 在函数的纯声明中作为参数类型几乎没有意义。然而 在里面 std::string const& 不是顶级的。

    通过引用传递 常量 避免数据复制效率低下。一般来说,对于将数据传递到函数的参数,可以传递小项(例如 int )按价值和潜在的较大项目 常量 常量 可以进行优化,也可以将其实现为指针。E、 例如,在32位Windows中 内景 int const& 不会减少数据复制,但是如果使用一个简单的编译器,可能会引入额外的间接寻址,这意味着有点低效率——因此有了小/大的区别。

    干杯。,

        4
  •  0
  •   Adesit    14 年前

    反之亦然,如果我看到一个常量指针,我立即假设它不是引用的原因是参数可以为空。