1

传递表示数据的常量缓冲区的参数时,最好通过 ref 传递吗?例如,可以传递一个字符串,const char * const表示指针和内容都是常量。

但会const char * const &更好吗?我最近看到材料指出按值传递 const 值是误导性的,因为无论如何都会制作副本,所以以一种不正当的方式通过constval 传递指针会产生误导?如果要使用指针,const它应该由 ref 传递,因此const char * const &最好?

4

2 回答 2

1

const char* const x表示 x 是指向常量 char 的常量指针

const char* const & x表示 x 是对指向常量 char 的常量指针的引用

第一个传递指针,第二个传递对指针的引用。就这两种情况下函数内可能的使用而言, x 充当只读字符指针。

针对 OP 的评论进行编辑:您可能混淆了 const 的正确性和通过引用传递的优势。

const int* x(相当于int const* x)是一个指向常量int的指针,int的值不能通过指针改变。换句话说,你可以做x = (int*)y(​​x 的值只会在函数范围内改变)但不能*x = 1

const int& x(等价于int const& x)表示 x 是对常量 int 的引用。你不能做x = 1

const int x表示 x 是一个 const int。这基本上相当于 x 是只读的。x 是另一个 int 的副本,因此如果我们删除const并修改x它,它只会在函数范围内被修改。我不明白为什么有人会在这种情况下反对 const 。这用于避免编程错误,例如将 x 分配给其他值,然后再次使用它而忘记了值的变化。

仅当 x 是避免复制的对象时,使用const int& x而不是const int x才有意义。出于同样的目的,我们也可以使用const int* const x.

使用const int* const &x而不是const int* const x具有相同的效果,但有一些警告。例如,如果你这样做,x可以为空!这本身可能会令人困惑,因为通常您希望通过引用传递的值保证为非空。但是,在这种情况下,引用可以指向一个空指针,如果我们尝试取消引用,这将导致异常。当然,取消引用空指针也会导致异常,但这是众所周知的。到目前为止,我还没有看到使用const int* const &x.

int * const x不等于。_ 表示指针是const,但是我们可以改变x的值(即我们可以做)const * const &xint * const x*x = 3

于 2013-04-11T14:58:02.120 回答
0

正如您所说,通过时reference,不会提供任何副本作为参数,而是通过引用绑定。

重要的是要理解在函数内部未更改的引用参数应该是对const.

程序员常犯的错误是将函数不会更改的参数定义为plain old references. 但是,这样做会给函数的调用者一种误导性的印象,即函数可能会改变其参数的值。在适用的情况下,最好使用 a reference to const,因为 aplain reference过度限制了可以与函数一起使用的参数类型。

在适用的情况下,因为如果您希望更改参数,那么它不应该const reference parameter.

此外,类似于 a reference to const, apointer to const没有说明指针指向的对象是否为const。定义一个指向的指针const只会影响我们可以用指针做什么。

还有关于指针top-level const的概念。low-level constAtop-level const表示指针本身是 a const,而如果指针指向 a const,则指向的那个const被称为 a low-level const

于 2013-04-11T14:50:07.970 回答