&符号&在构造函数中使用const

时间:2012-04-03 18:35:18

标签: c++ pass-by-const-reference

有些人可以告诉我为什么我们通常把const和&与一些在构造函数中传递的对象,例如。

Book::Book(const Date &date);

我在这里的困惑通常是& sign用于某个函数,因为该值是通过引用传递的,并且函数中该变量发生的任何更改都应该在之后反映出来。但另一方面,const表示不能对该变量进行任何分配。

如果某个机构对此有一些好主意,请告诉我原因。

6 个答案:

答案 0 :(得分:8)

这样做是为了避免不必要的复制。例如,以下代码:

Book::Book(Date date):
date_(date)
{
}

当你调用这个构造函数时,它会复制date两次,一次调用构造函数,一次复制到你的成员变量中。

如果你这样做:

Book::Book(const Date &date):
date_(date)
{
}

date仅复制一次。它本质上只是一种优化。

答案 1 :(得分:5)

最常见的替代方法是传递价值:

Book::Book(Date date);

当您传递的参数已经是date时,通过const引用传递会阻止复制参数Date。复制对象可能是不必要的,执行起来可能很昂贵,或者可能导致切片对象(以及不正确的结果)。

'切片'基本上是通过复制将对象的类型降级到其基础。对于多态类型,这实际上可以改变其行为,因为参数将被复制为其基础(Date),然后对其多态接口的调用会有所不同,因为实现已更改(例如,其虚拟方法将使用而是基地的实施。)

答案 2 :(得分:2)

这意味着您通过引用传递对象(如您所述),但是对象本身不能从函数(在本例中为ctor)中更改。

原因可能是:

  • 您不想复制整个对象,以提高您的代码效率
  • 您不想意外更改传入的对象
  • 您希望能够使用具有未命名临时值的功能
  • 您希望能够传递源自所述类型的对象(在这种情况下为Date

关于第三点,请考虑:

Book b(Date());

答案 3 :(得分:0)

const引用是一种将数据传递给类而不将数据复制到本地副本的方法,并且仍然保证该函数不会修改原始对象。

答案 4 :(得分:0)

通常是输入参数的性能优化。如果省略'&'参数由值接受,输入对象必须在传递给函数之前复制。通过引用传递绕过副本。

答案 5 :(得分:0)

在c ++中,如果函数的参数类型类似于const Type&,那么您正在做的是允许用户通过引用传递中的某些值 - 指向该值是隐式传入的,但为了便于使用,编译器允许您将其视为值。

在某些情况下,编译器也可以优化它,以便根本不使用指针,函数可以直接引用值的内存。

使用const的原因是为了保护自己不会改变用户不希望你改变的内存,并且如果用户传入一个const变量,也可以让它自己工作。