是否有任何合理的用例,其中一个应该使用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。]
答案 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变量作为参数调用函数时才使用它们。我可能是老式的,但在其他所有情况下,指针方式对我来说都更好。