有人可以告诉我为什么我们通常将 const 和 & 与一些在构造函数中传递的对象放在一起的原因吗?
Book::Book(const Date &date);
我在这里的困惑是,通常在某个函数中使用 & 符号,因为该值是通过引用传递的,并且函数中该变量发生的任何更改都应在之后反映。但另一方面 const 表示不能对该变量进行赋值。
如果有人对此有一些好主意,请告诉我原因。
有人可以告诉我为什么我们通常将 const 和 & 与一些在构造函数中传递的对象放在一起的原因吗?
Book::Book(const Date &date);
我在这里的困惑是,通常在某个函数中使用 & 符号,因为该值是通过引用传递的,并且函数中该变量发生的任何更改都应在之后反映。但另一方面 const 表示不能对该变量进行赋值。
如果有人对此有一些好主意,请告诉我原因。
这样做是为了避免不必要的复制。举个例子,下面的代码:
Book::Book(Date date):
date_(date)
{
}
当您调用此构造函数时,它将复制date
两次,一次是在您调用构造函数时,一次是在您将其复制到成员变量时。
如果你这样做:
Book::Book(const Date &date):
date_(date)
{
}
date
只复制一次。它本质上只是一个优化。
最常见的替代方法是按值传递:
Book::Book(Date date);
当您传递date
的参数已经是一个Date
. 复制对象可能是不必要的,执行成本可能很高,或者可能导致对象切片(以及不正确的结果)。
“切片”基本上是通过复制到其基础来降低对象的类型。对于多态类型,这实际上可以改变其行为,因为参数将被复制为其基 ( Date
),然后对其多态接口的调用将不同,因为实现已更改(例如,其虚拟方法将使用基的实现) .
这意味着您通过 refrence 传递对象(如您所述),但对象本身不能从函数(在本例中为 ctor)更改。
其原因可能是:
Date
在这种情况下)对于第三点,请考虑:
Book b(Date());
它通常是对输入参数的性能优化。如果省略“&”,则参数被值接受,输入对象在传递给函数之前必须被复制。通过引用传递绕过副本。
在 c++ 中,当您有一个函数的参数类型类似于const Type&
时,您所做的是允许用户通过引用传递一些值- 指向该值的指针被隐式传递,但为了便于使用,编译器允许您将其视为一个值。
在某些情况下,编译器还可以对其进行优化,使其完全不使用指针,函数可以直接引用该值的内存。
使用它的原因const
是为了保护您自己不会更改用户不希望您更改的内存,并且如果用户传入 const 变量,它仍然可以工作。
const 引用是一种将数据传递给类而不将数据复制到本地副本的方法,并且仍然保证原始对象不会被函数修改。