使用引用代替指针是多么合理,因为您可以使用'来访问成员。'而不是' ->
'运营商。
就像在函数内部一样
void func(stStates &states)
{
states.nextState = 0;
}
而不是
void func(stStates *states)
{
states->nextState = 0;
}
答案 0 :(得分:3)
当你需要指针时使用指针,当你不想使用引用但不想通过值传递时使用引用。事实上,一个人比另一个人更多地使用一个角色应该是你最不关心的问题。
答案 1 :(得分:3)
void func(stStates *states) { states->nextState = 0; }
写这样的代码是勇敢的!
至少你应断言,在解除引用指针参数之前没有传递nullptr
:
void func(stStates *states)
{
assert(states);
states->nextState = 0;
}
如果您在调用函数时不需要传递stStates
的有效实例,那么或者您可以顺利处理:
void func(stStates *states)
{
if(states) {
states->nextState = 0;
}
}
这些提到的方法都不能保存您传递的无效指针,如:
stStates* states; // << uninitialized, points elsewhere
func(states);
好吧可能有编译器警告。
另一方面,使用引用主要需要在编译时进行正确的初始化,并避免上述问题。
虽然你仍然可以做this这样的愚蠢的事情,但编译器不会警告你:
#include <iostream>
int main()
{
int* p = nullptr;
int& r = *p;
r = 42;
}
结果:
clang++ -std=c++14 -Os -Wall -lboost_timer -lboost_system main.cpp && ./a.out
bash: line 7: 26635 Illegal instruction (core dumped) ./a.out
答案 2 :(得分:2)
作为编码指南,最好使用引用而不是指针。当参数是引用类型时,该函数可以简单地使用该对象。当参数是指针类型时,您总是必须添加逻辑来处理作为NULL指针的参数。