有些人可以告诉我为什么我们通常把const和&与一些在构造函数中传递的对象,例如。
Book::Book(const Date &date);
我在这里的困惑通常是& sign用于某个函数,因为该值是通过引用传递的,并且函数中该变量发生的任何更改都应该在之后反映出来。但另一方面,const表示不能对该变量进行任何分配。
如果某个机构对此有一些好主意,请告诉我原因。
答案 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变量,也可以让它自己工作。