在引用(T&)和const指针(T * const)之间进行选择

时间:2011-09-29 18:07:04

标签: c++ pointers coding-style reference

是否有任何合理的用例,其中一个应该使用const指针而不是引用?

T obj;
T &r = obj;  // style-1
T* const p = &obj; // style-2

这两种风格都可以用于同一目的。我总是喜欢代码中的第一种样式,并将后一种样式视为已弃用。但是我仍然想知道是否错过了第二种风格更好的用例?

编辑:不限于上面的例子,我在更广泛的意义上讲,

void foo (T& r); // style-1
void foo (T* const p); // style-2

[我从几个答案中看到,style-2允许传递null。]

4 个答案:

答案 0 :(得分:5)

const指针(T* const)可以是NULL,这在将参数传递给函数或从函数返回值时非常有用。例如,如果您有搜索功能,如果找不到任何内容,您可能希望它返回NULL。如果它返回引用类型,则不能这样做。

答案 1 :(得分:2)

让我在这里走出困境。既然你明确地说“const指针”,我假设你谈论函数参数甚至函数返回值。对于由copy传递的函数参数,constness是一个无关的实现细节:

void foo(T *);          // declaration

void foo(T * const pt)  // implementation,
{ /* ... */ }           // pt is const inside the body (who cares?)

因此,想到的唯一用例是,如果您需要在自己的代码中的某处创建别名。在那种情况下,我总是更喜欢参考。比较:

for (auto it = box.begin(); it != box.end(); ++it)
{
  T & trinket = *it;     // nice
  T * const ptr = &*it;  // wtpf?

  // ...
}

由于您编辑了问题:函数参数显然存在差异。

void foo(T &);
void bar(T *);

foo中,您可以保证有一个可行的,可变的对象引用;在bar中,你必须检查指针是否为空(给你一个可选参数的概念)。从这个意义上讲,T&T*并不具有可比性。

答案 2 :(得分:1)

对于函数参数,我更喜欢指向引用的指针,因为我可以在调用站点告诉参数是out参数。如果函数参数是const引用,那么我更喜欢引用。

另一个很大的区别是r不能为空,所以如果你需要它,那么你需要style-2

答案 3 :(得分:0)

1)使用引用时,对象必须存储在变量中。例如,你不能这样做:

void funct (T &);
funct (T ("Calling constructor"));

必须:

void funct (T &);
T obj ("Calling constructor");
funct (obj);

2)使用引用时,你无法测试它的值(例如,检查它是否为常用的NULL)

除此之外,它也是一样的。

我通常只在使用true变量作为参数调用函数时才使用它们。我可能是老式的,但在其他所有情况下,指针方式对我来说都更好。