Jac*_*eza 249 c++ variables pointers reference
在给函数提供原始变量时,最好的做法是:
unsigned long x = 4;
void func1(unsigned long& val) {
val = 5;
}
func1(x);
Run Code Online (Sandbox Code Playgroud)
要么:
void func2(unsigned long* val) {
*val = 5;
}
func2(&x);
Run Code Online (Sandbox Code Playgroud)
IOW:有没有理由选择一个而不是另一个?
Nil*_*nck 278
我的经验法则是:
如果你想用它们做指针运算(例如递增指针地址以逐步遍历数组)或者你必须传递一个NULL指针,请使用指针.
否则使用参考.
Joh*_*ell 71
我真的认为你将从建立以下函数调用编码指南中受益:
和所有其他地方一样,总是const正确的.
const符.如果值0/NULL是当前上下文中的有效输入,则仅通过指针传递值.
理由1:作为调用者,您会看到无论您传入的是什么,都必须处于可用状态.
理由2:由于叫,你知道,无论发生什么事的是处于可用状态.因此,不需要对该值进行NULL检查或错误处理.
基本原理3:基础知识1和2将被编译器强制执行.如果可以的话,总是在编译时捕获错误.
如果函数参数是out-value,则通过引用传递它.
只有当值是POD(普通旧数据结构)或足够小(内存方式)或以其他方式足够便宜(按时间)复制时,选择"按值传递"而不是"传递const引用" .
Aar*_*bbs 24
这最终成为主观的.到目前为止的讨论很有用,但我认为没有正确或果断的答案.很多将取决于风格指南和您当时的需求.
虽然使用指针有一些不同的功能(无论是否可以为NULL),但输出参数的最大实际差异纯粹是语法.例如,谷歌的C++风格指南(https://google.github.io/styleguide/cppguide.html#Reference_Arguments)只强制指针输出参数,并且只允许引用为const.推理是可读性:具有值语法的东西不应该具有指针语义.我并不是说这必然是对或错,但我认为这里的重点是风格,而不是正确性.
如果要修改变量的值,则应传递指针.即使技术上传递引用或指针是相同的,在您的用例中传递指针更具可读性,因为它"通告"该值将由函数更改的事实.
指针
当前未指向有效内存位置的指针被赋予值 null(即为零)
BaseType* ptrBaseType;
BaseType objBaseType;
ptrBaseType = &objBaseType;
Run Code Online (Sandbox Code Playgroud)& 是一个一元运算符,返回其操作数的内存地址。
解引用运算符 (*) 用于访问存储在指针指向的变量中的值。
int nVar = 7;
int* ptrVar = &nVar;
int nVar2 = *ptrVar;
Run Code Online (Sandbox Code Playgroud)参考
引用 (&) 就像现有变量的别名。
引用 (&) 就像一个自动取消引用的常量指针。
它通常用于函数参数列表和函数返回值。
创建引用时必须对其进行初始化。
一旦一个引用被初始化为一个对象,它就不能被更改为引用另一个对象。
您不能有 NULL 引用。
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
Run Code Online (Sandbox Code Playgroud)小智 5
如果您有一个参数,您可能需要指示缺少值,通常的做法是使参数成为指针值并传入NULL.
在大多数情况下(从安全角度来看)更好的解决方案是使用boost :: optional.这允许您通过引用传递可选值,也可以作为返回值.
// 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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
106853 次 |
| 最近记录: |