在给函数使用原始变量时,更好的做法是什么:

unsigned long x = 4;

void func1(unsigned long& val) {
     val = 5;            
}
func1(x);

or:

void func2(unsigned long* val) {
     *val = 5;
}
func2(&x);

勒夫:有什么理由选择一个而不是另一个吗?


当前回答

通过const引用传递,除非有原因你希望改变/保留你传递的内容。

在大多数情况下,这将是最有效的方法。

确保对不想更改的每个形参都使用const,因为这不仅可以防止您在函数中做一些愚蠢的事情,还可以很好地向其他用户指示函数对传入的值做了什么。这包括当你只想改变所指向的对象时,创建一个const指针…

其他回答

通过const引用传递,除非有原因你希望改变/保留你传递的内容。

在大多数情况下,这将是最有效的方法。

确保对不想更改的每个形参都使用const,因为这不仅可以防止您在函数中做一些愚蠢的事情,还可以很好地向其他用户指示函数对传入的值做了什么。这包括当你只想改变所指向的对象时,创建一个const指针…

如果你有一个参数,你可能需要指出没有一个值,通常的做法是使参数为指针值并传递NULL。

在大多数情况下(从安全角度来看),更好的解决方案是使用boost::可选。这允许您通过引用传递可选值,也可以作为返回值。

// 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);
}

我真的认为你将受益于建立以下函数调用编码指南:

As in all other places, always be const-correct. Note: This means, among other things, that only out-values (see item 3) and values passed by value (see item 4) can lack the const specifier. Only pass a value by pointer if the value 0/NULL is a valid input in the current context. Rationale 1: As a caller, you see that whatever you pass in must be in a usable state. Rationale 2: As called, you know that whatever comes in is in a usable state. Hence, no NULL-check or error handling needs to be done for that value. Rationale 3: Rationales 1 and 2 will be compiler enforced. Always catch errors at compile time if you can. If a function argument is an out-value, then pass it by reference. Rationale: We don't want to break item 2... Choose "pass by value" over "pass by const reference" only if the value is a POD (Plain old Datastructure) or small enough (memory-wise) or in other ways cheap enough (time-wise) to copy. Rationale: Avoid unnecessary copies. Note: small enough and cheap enough are not absolute measurables.

可以时使用引用,必要时使用指针。 来自c++常见问题:“什么时候应该使用引用,什么时候应该使用指针?”

考虑一下c#的out关键字。编译器要求方法的调用者将out关键字应用于任何out参数,即使它已经知道它们是否存在。这是为了提高可读性。尽管在现代ide中,我倾向于认为这是语法(或语义)突出显示的工作。