默认情况下,参数通过值传递给函数,这意味着函数会收到所传递的对象的副本。对于大型对象,创建副本可能成本高昂,并非始终必要。若要使实参通过引用(特别是左值引用)进行传递,请向形参添加引用限定符:
void DoSomething(std::string& input){...}
当函数修改通过引用传递的参数时,它会修改原始对象,而不是本地副本。若要防止函数修改这类实参,请将形参限定为
const&:
void DoSomething(const std::string& input){...}
C++ 11:若要显式处理通过右值引用或通过左值引用传递的实参,请对形参使用双与号以指示通用引用:
void DoSomething(const std::string&& input){...}
只要关键字 void 是实参声明列表中的第一个也是唯一一个成员,那么在形参声明列表中使用单个关键字 void 声明的函数就没有实参。列表中的其他地方的 void 类型的参数产生错误。例如:
// OK same as GetTickCount()
long GetTickCount( void );
请注意,尽管指定 void 参数是非法(此处所述的除外),但派生自类型 void 的类型(如指向 void 的指针和 void 的数组)可以出现在参数声明列表中的任何位置。
默认参数
函数签名中的最后一个或几个形参可能会分配有默认实参,这意味着调用方可能会在调用函数时省略实参(除非要指定某个其他值)。
int DoSomething(int num,
string str,
Allocator& alloc = defaultAllocator)
{ ... }
// OK both parameters are at end
int DoSomethingElse(int num,
string str = string{ "Working" },
Allocator& alloc = defaultAllocator)
{ ... }
// C2548: 'DoMore': missing default parameter for parameter 2
int DoMore(int num = 5, // Not a trailing parameter!
string str,
Allocator& = defaultAllocator)
{...}
函数返回类型
函数可能不会返回另一个函数或内置数组;但是,它可以返回指向这些类型的指针,或生成函数对象的 lambda。除了这些情况,函数可以返回处于范围内的任何类型的值,或者它可以返回任何值(在这种情况下返回类型是 void)。
结尾返回类型
“普通”返回类型位于函数签名左侧。结尾返回类型位于签名的最右侧,前面带有 -> 运算符。当返回值的类型取决于模板参数时,结尾返回类型在函数模板中尤其有用。
template<typename Lhs, typename Rhs>
auto Add(const Lhs& lhs, const Rhs& rhs) -> decltype(lhs + rhs)
{
return lhs + rhs;
}










