11

有人可以告诉我为什么我们通常将 const 和 & 与一些在构造函数中传递的对象放在一起的原因吗?

Book::Book(const Date &date);

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

如果有人对此有一些好主意,请告诉我原因。

4

6 回答 6

13

这样做是为了避免不必要的复制。举个例子,下面的代码:

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

当您调用此构造函数时,它将复制date两次,一次是在您调用构造函数时,一次是在您将其复制到成员变量时。

如果你这样做:

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

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

于 2012-04-03T18:42:07.760 回答
6

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

Book::Book(Date date);

当您传递date的参数已经是一个Date. 复制对象可能是不必要的,执行成本可能很高,或者可能导致对象切片(以及不正确的结果)。

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

于 2012-04-03T18:41:04.157 回答
2

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

其原因可能是:

  • 您不想复制完整的对象,以使您的代码更高效
  • 您不想意外更改传入的对象
  • 您希望能够将函数与未命名的临时对象一起使用
  • 您希望能够传递从指定类型派生的对象(Date在这种情况下)

对于第三点,请考虑:

Book b(Date());
于 2012-04-03T18:42:47.110 回答
1

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

于 2012-04-03T18:42:32.150 回答
1

在 c++ 中,当您有一个函数的参数类型类似于const Type&时,您所做的是允许用户通过引用传递一些值- 指向该值的指针被隐式传递,但为了便于使用,编译器允许您将其视为一个值。

在某些情况下,编译器还可以对其进行优化,使其完全不使用指针,函数可以直接引用该值的内存。

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

于 2012-04-03T18:43:45.620 回答
0

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

于 2012-04-03T18:41:37.400 回答