题
什么是好的做法时,给人一种功能的原始变量工作:
unsigned long x = 4;
void func1(unsigned long& val) {
val = 5;
}
func1(x);
或者:
void func2(unsigned long* val) {
*val = 5;
}
func2(&x);
IOW:是否有任何理由选择一个比另一个?
解决方案
我的经验法则是:
如果你想用它们进行指针运算(例如,递增指针地址以逐步执行数组),或者你必须传递NULL指针,请使用指针。
否则使用参考文献。
其他提示
我真的认为你将会从中受益建立的下列功能叫编码指南:
在所有其他地方,总是
const
-正确的。- 注:这意味着,除其他事项外,只有出价值(见项目3)和价值传递的价值(见项目4)可缺少的
const
说明符。
- 注:这意味着,除其他事项外,只有出价值(见项目3)和价值传递的价值(见项目4)可缺少的
只有通过一价值通过的指针,如果价值0/NULL是一个有效的输入,在目前上下文中。
理由1:作为 一个呼叫, 你看,无论你通过 必须 在可用的状态。
理由2:作为 叫, 你知道什么来 是 在可用的状态。因此,没有空-检查或差错处理需要作用,值。
理由3:原则1和2将 编译器强制执行.总是捉错误,在编制时间如果可以的话。
如果一个函数是一个值,然后通过它的参考。
- 理由:我们不想打破的项目2...
选择"通过价值"在"通常量参考"如果价值是POD(普通老Datastructure 的)或者小型足够的(存储器聪明-)或以其他方式够便宜(时间上)复制。
- 理由:避免不必要的副本。
- 注: 足够小的 和 足够便宜 不绝对不好缺少计量标准又不理.
这最终会成为主观的。到目前为止的讨论很有用,但我认为没有正确或果断的答案。很大程度上取决于风格指南和当时的需求。
虽然使用指针有一些不同的功能(无论是否可以为NULL),但输出参数的最大实际差异纯粹是语法。 Google的C ++风格指南( https://google.github.io/styleguide/cppguide.html#例如,Reference_Arguments )仅指定输出参数的指针,并且仅允许const的引用。推理是可读性:具有值语法的东西不应该具有指针语义。我并不是说这必然是对或错,但我认为这是一个风格问题,而不是正确性。
如果要修改变量的值,则应传递指针。 尽管技术上传递引用或指针是相同的,但在用例中传递指针更具可读性,因为它“广告”了该值将由函数更改的事实。
如果你有一个参数,你可能需要指出缺少一个值,通常的做法是使参数成为指针值并传入NULL。
在大多数情况下(从安全角度来看)更好的解决方案是使用提升::可选。这允许您通过引用传递可选值,也可以作为返回值。
// Sample method using optional as input parameter
void PrintOptional(const boost::optional<std::string>& optional_str)
{
if (optional_str)
{
cout << *optional_str << std::endl;
}
else
{
cout << "(no string)" << std::endl;
}
}
// Sample method using optional as return value
boost::optional<int> ReturnOptional(bool return_nothing)
{
if (return_nothing)
{
return boost::optional<int>();
}
return boost::optional<int>(42);
}
尽可能使用引用,必要时使用指针。 从 C ++ FAQ:“我应该何时使用引用,何时应该使用指针? &QUOT;
指针
- 一指针是一个变量,拥有记忆的地址。
- 指针宣言》中包括的一个基本类型、*和变量名称。
- 指针可以指以任何数量的变量生
指针,目前并不指向一个有效的存储位置给出的价值null(其零)
BaseType* ptrBaseType; BaseType objBaseType; ptrBaseType = &objBaseType;
这是一元的操作者返回存储地址的其操作数。
取消引用操作员(*)用于访问的价值存在的可变其指针指向。
int nVar = 7; int* ptrVar = &nVar; int nVar2 = *ptrVar;
参考
基准(&)是喜欢别名现有的变量。
基准(&)就像是一个指定自动取消引用的.
它通常用于功能的参数清单和功能返回值。
基准必须被初始化时,它创建的。
一旦参考初始化为对象,就不能将改为提及另一个对象。
你不能拥有空的参考。
Const参考可以参考const int。这样做是与一个临时变量与价值的const
int i = 3; //integer declaration int * pi = &i; //pi points to the integer i int& ri = i; //ri is refers to integer i – creation of reference and initialization
引用是一个隐式指针。基本上,您可以更改引用指向的值,但不能将引用更改为指向其他内容。所以我的2美分是,如果您只想更改参数的值,请将其作为参考传递,但如果您需要将参数更改为指向其他对象,请使用指针传递它。
考虑C#的out关键字。编译器要求方法的调用者将out关键字应用于任何out args,即使它已经知道它们是否存在。这旨在增强可读性。虽然使用现代IDE,我倾向于认为这是语法(或语义)突出显示的工作。
通过const引用,除非您有理由更改/保留您传入的内容。
在大多数情况下,这将是最有效的方法。
确保在您不希望更改的每个参数上使用const,因为这不仅可以保护您不会在函数中做一些愚蠢的事情,而且可以向其他用户提供一个很好的指示,该函数对传入的值执行的操作。这包括当你只想改变指向...的什么时,制作指针const。
指针:
- 可以分配
nullptr
(或NULL
). - 在呼叫的网站必须使用
&
如果你的类型不是指自己, 使得明确要修改对象。 - 指针可能反弹。
参考文献:
- 不能空。
- 一旦结,不能改变。
- 呼叫者不需要明确使用
&
.这被认为是有时 不好因为你必须去的执行情况的功能来看看 你的参数进行修改。
引用类似于指针,除了您不需要使用前缀&#8727;访问引用引用的值。另外,在初始化之后,不能引用引用不同的对象。
引用对于指定函数参数特别有用。
有关详细信息,请参阅“A Tour of C ++”。通过“Bjarne Stroustrup” (2014)第11-12页