通过ref传递const指针比通过值更好?

时间:2013-04-11 14:01:25

标签: c++

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

const char * const &会更好吗?我最近看到的材料表明,按值传递const值是误导性的,因为无论如何都要复制,所以以一种不正常的方式将const指针传递给val会产生误导?如果指针是const,那么它应该由ref传递,因此const char * const &最好?

2 个答案:

答案 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 &xint * const x表示指针是const,但我们可以更改x的值(即我们可以*x = 3

答案 1 :(得分:0)

当你通过reference时,正如你所说,没有副本作为参数提供,而是通过引用绑定。

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

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

在适用的情况下,如果您希望更改参数,则应该const reference parameter

此外,类似于reference to constpointer to const没有说明指针所指向的对象是const。定义指向const的指针只会影响我们使用指针做什么。

对于指针,还有top-level constlow-level const的概念。 top-level const表示指针本身是const,而如果指针指向const,则指向的const称为low-level const。< / p>