传递表示数据的常量缓冲区的参数时,最好通过 ref 传递吗?例如,可以传递一个字符串,const char * const
表示指针和内容都是常量。
但会const char * const &
更好吗?我最近看到材料指出按值传递 const 值是误导性的,因为无论如何都会制作副本,所以以一种不正当的方式通过const
val 传递指针会产生误导?如果要使用指针,const
它应该由 ref 传递,因此const char * const &
最好?
传递表示数据的常量缓冲区的参数时,最好通过 ref 传递吗?例如,可以传递一个字符串,const char * const
表示指针和内容都是常量。
但会const char * const &
更好吗?我最近看到材料指出按值传递 const 值是误导性的,因为无论如何都会制作副本,所以以一种不正当的方式通过const
val 传递指针会产生误导?如果要使用指针,const
它应该由 ref 传递,因此const char * const &
最好?
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 &x
int * const x
*x = 3
正如您所说,通过时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 const
Atop-level const
表示指针本身是 a const
,而如果指针指向 a const
,则指向的那个const
被称为 a low-level const
。