给函数一个原始变量以供使用时,更好的做法是:
unsigned long x = 4;
void func1(unsigned long& val) {
val = 5;
}
func1(x);
要么:
void func2(unsigned long* val) {
*val = 5;
}
func2(&x);
爱荷华州:有什么理由选择一个?
给函数一个原始变量以供使用时,更好的做法是:
unsigned long x = 4;
void func1(unsigned long& val) {
val = 5;
}
func1(x);
要么:
void func2(unsigned long* val) {
*val = 5;
}
func2(&x);
爱荷华州:有什么理由选择一个?
Answers:
我的经验法则是:
如果要使用指针进行算术运算(例如,增加指针地址以遍历数组)或必须传递NULL指针,请使用指针。
否则使用引用。
Base* b = new Derived()
)呢?这似乎是没有指针就无法处理的情况。
我真的认为您将从建立以下函数调用编码准则中受益:
与在所有其他地方一样,总是const
正确的。
const
符。仅当值0 / NULL是当前上下文中的有效输入时,才通过指针传递值。
基本原理1:作为呼叫者,您会看到传入的任何内容都必须处于可用状态。
理由2:由于叫,你知道,无论发生什么事的是处于可用状态。因此,不需要对该值进行NULL检查或错误处理。
基本原理3:基本原理1和2将由编译器强制执行。如果可以,请始终在编译时捕获错误。
如果函数参数是一个超值,则通过引用传递它。
仅当值是POD(普通旧数据结构)或足够小(按存储方式)或以其他便宜方式(按时间)复制时,才选择“按值传递”而不是“按常量引用传递” 。
std::vector<>
。
这最终最终成为主观的。到目前为止的讨论是有用的,但是我认为对此没有正确或决定性的答案。很大程度上取决于样式准则和您当时的需求。
尽管指针具有一些不同的功能(某些东西是否可以为NULL),但输出参数的最大实际差异是语法。例如,Google的C ++样式指南(https://google.github.io/styleguide/cppguide.html#Reference_Arguments)仅强制要求输出参数的指针,并且仅允许const引用。推理是可读性之一:具有值语法的内容不应具有指针语义。我并不是说这必然是对还是错,但是我认为这里的重点是样式问题,而不是正确性。
如果要修改变量的值,则应传递一个指针。即使从技术上讲传递引用或指针在技术上是相同的,但在用例中传递指针更易读,因为它“宣告”值将由函数更改的事实。
const
非const
引用,但是您可以查看参数是否通过ala &x
vs. 传递x
,并使用该约定编码是否可以修改参数。(这就是说,有时候您想传递一个const
指针,因此惯例只是一个提示。可以争论的是,怀疑某些东西在不被修改时可能会被修改的危险要比认为在某件事不会被修改时要危险的多。 ....)
如果您有一个可能需要指示不存在值的参数,通常的做法是使该参数成为指针值并传入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);
}
可以使用引用,而必须使用指针。来自C ++常见问题解答:“何时应使用引用,何时应使用指针?”
指针
当前未指向有效内存位置的指针的值为null(这是零)
BaseType* ptrBaseType;
BaseType objBaseType;
ptrBaseType = &objBaseType;
&是一元运算符,返回其操作数的内存地址。
解引用运算符(*)用于访问指针所指向的变量中存储的值。
int nVar = 7;
int* ptrVar = &nVar;
int nVar2 = *ptrVar;
参考
引用(&)类似于现有变量的别名。
引用(&)就像是自动取消引用的常量指针。
它通常用于函数参数列表和函数返回值。
创建引用时,必须对其进行初始化。
一旦将引用初始化为一个对象,就不能将其更改为引用另一个对象。
您不能有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
引用是隐式指针。基本上,您可以更改引用所指向的值,但不能更改引用以指向其他内容。所以我的2美分是,如果您只想更改参数的值,请将其作为引用传递,但是如果您需要更改参数以指向其他对象,则使用指针将其传递。
指标:
nullptr
(或NULL
)。&
如果您的类型本身不是指针,则它,从而明确地在修改对象。参考文献:
&
。有时这被认为是不好的,因为您必须转到函数的实现以查看您的参数是否被修改。