当传递表示数据的常量缓冲区的参数时,最好通过ref传递吗?例如,字符串可以作为const char * const
传递,表示指针和内容都是常量。
但const char * const &
会更好吗?我最近看到的材料表明,按值传递const值是误导性的,因为无论如何都要复制,所以以一种不正常的方式将const
指针传递给val会产生误导?如果指针是const
,那么它应该由ref传递,因此const char * const &
最好?
答案 0 :(得分: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
可以为null!这本身可能会令人困惑,因为通常您会期望通过引用传递的值保证为非null。但是在这种情况下,引用可以是空指针,如果我们尝试取消引用,则会导致异常。当然,取消引用空指针也会导致异常,但这是众所周知的。到目前为止,我没有看到使用const int* const &x
的任何优势。
int * const x
不等同于const * const &x
。 int * const x
表示指针是const,但我们可以更改x的值(即我们可以*x = 3
)
答案 1 :(得分:0)
当你通过reference
时,正如你所说,没有副本作为参数提供,而是通过引用绑定。
重要的是要理解在函数内部未更改的引用参数应该是对const
的引用。
程序员常犯的错误是将函数定义的参数定义为plain old references
。但是,这样做会给函数的调用者带来误导性的印象,即函数可能会改变其参数的值。在适用的情况下,最好使用reference to const
,因为plain reference
过度限制了可以与函数一起使用的参数类型。
在适用的情况下,如果您希望更改参数,则不应该const reference parameter
。
此外,类似于reference to const
,pointer to const
没有说明指针所指向的对象是const
。定义指向const
的指针只会影响我们使用指针做什么。
对于指针,还有top-level const
和low-level const
的概念。 top-level const
表示指针本身是const
,而如果指针指向const
,则指向的const
称为low-level const
。< / p>