其 linkage 规范(extern 或 static)。
Declare printf with C linkage.
extern "C" int printf( const char *fmt, ... );
inline,指示编译器将对函数的每个调用替换为函数代码本身。在某个函数快速执行并且在性能关键代码段中重复调用的情况下,内联可以帮助提高性能。
inline double Account::GetBalance()
{
return balance;
}
noexcept,指定函数是否可以引发异常。在下面的示例中,函数在 is_pod 表达式计算结果为 true 时不引发异常。
#include <type_traits>
template <typename T>
T copy_object(T& obj) noexcept(std::is_pod<T>) {...}
仅限成员函数)cv 限定符,指定函数是 const 还是 volatile。
(仅限成员函数)virtual、override 或 final。 virtual 指定可以在派生类中重写函数。 override 表示派生类中的函数在重写虚函数。 final 表示函数不能在任何进一步的派生类中进行重写。
(仅限成员函数仅)应用于成员函数的 static 表示函数不与类的任何对象实例关联。
(仅限非静态成员函数)ref 限定符,向编译器指定隐式对象参数 (*this) 是右值引用与左值引用时要选择的函数重载。
下图显示了函数定义的各个部分。灰色区域是函数体。
函数定义部分
函数定义
函数体内声明的变量称为局部变量。它们会在函数退出时超出范围;因此,函数应永远不返回对局部变量的引用!
函数模板
函数模板类似于类模板;它基于模板参数生成具体功能。在许多情况下,模板能够推断类型参数,因此无需显式指定它们。
template<typename Lhs, typename Rhs>
auto Add2(const Lhs& lhs, const Rhs& rhs)
{
return lhs + rhs;
}
auto a = Add2(3.13, 2.895); // a is a double
auto b = Add2(string{ "Hello" }, string{ " World" }); // b is a std::string
有关详细信息,请参阅函数模板
函数形参和实参
函数具有零种或多种类型的逗号分隔参数列表,其中每个参数都具有可以用于在函数体内访问它的名称。函数模板可以指定其他类型或值参数。调用方传递实参(其类型与形参列表兼容的具体值)。











