C++函数传参方式

C++函数传参方式

引言

C++函数传参方式有很多种选择,可以传值、传指针、传引用、返回值等,故需要一种内部规范让函数参数传递简明易懂,同时兼顾性能;

代码示例

以下代码使用了结构化绑定,需要编译器支持C++17;

#include <tuple>

class CDemo1 {
    // ...
};

class CDemo2 {
    // ..
};

// 函数传参方式示例
std::tuple<double, std::string> testFunc(const int n, 
                                         const std::vector<double>& x,
                                         CDemo1& out1,
                                         CDemo2* out2 = nullptr)
{
    // do something
}

int main()
{
    const int n = 10;
    const std::vector<double> x = {1.1, 2.2, 3.3};
    CDemo1 d1;
    CDemo2 d2;
    auto [y, errInfo] = testFunc(n, x, d1, &d2);
    
    // ...
    
    return 0;
}

结论

通过上述代码示例,可总结函数传参中传值、传引用、传指针、函数返回值的的 最佳实践

函数入参

POD类型使用常值(如 const double x);

类类型使用常引用(如 const T& x);

函数出参

若有可能,优先使用函数返回值,尽量不要使用函数出参,以增强可读性;

若需要使用出参,优先使用 T& ;

在出参中,若可能为空(如 有默认参数 = nullptr)或者其指向可能变化,才使用 T* ;

函数返回值

若是新产生的变量,则返回 单个/多个 值(类类型同样可以返回值,只要保证返回值优化发生,则性能与出参是一样的);

若是修改函数体之外的变量,可返回比本函数生命周期更长变量的引用/指针;


本文作者: 王同学