在C ++中使用引用代替指针是否合理?

时间:2017-03-01 17:49:04

标签: c++ pointers reference

使用引用代替指针是多么合理,因为您可以使用'来访问成员。'而不是' ->'运营商。 就像在函数内部一样

void func(stStates &states)
{
   states.nextState = 0;
}

而不是

void func(stStates *states)
{
   states->nextState = 0;
}

3 个答案:

答案 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指针的参数。