最简c++函数为void foo() {}:必须含返回类型、函数名、空括号和函数体,缺一不可。

怎么写一个最简 C++ 函数
函数必须有返回类型、名字、括号和函数体,哪怕什么都不做。void 表示不返回值,int 表示返回整数——漏掉返回类型(比如写成 foo() { })在现代 C++ 中直接编译失败。
- 函数定义不能嵌套在另一个函数内部(C++ 不支持闭包式嵌套定义)
- 函数名不能是关键字,比如
class、return会报错 - 空参数列表必须显式写
void或留空,但二者语义不同:func(void)明确表示无参,func()在 C++ 中也等价于无参(这点和 C 不同) - 函数定义前若未声明,且在调用后才定义,需加前置声明,否则链接时报
undefined reference to 'func()'
C++ 函数参数传值 vs 传引用 vs 传指针
默认是值传递:实参会拷贝一份进形参,改形参不影响原变量。想改原变量或避免大对象拷贝,就得换方式。
- 传
const &最常用:既避免拷贝,又防止函数内误改,比如void print(const std::string& s) - 传非 const 引用(
int& x)能修改原始变量,但不能绑定到临时量,比如f(42)会编译失败 - 传指针(
int*)可为空,适合可选参数,但调用时得写&x,容易漏或传错地址 - 移动语义(
T&&)只对右值生效,常用于构造/赋值函数,普通参数别乱加&&,否则f(x)可能直接编译不过
函数返回值要注意生命周期和拷贝开销
返回局部变量的引用或指针是典型错误,会导致悬垂引用:int& bad() { int x = 42; return x; } —— 函数结束,x 被销毁,后续访问未定义。
- 返回局部对象值(如
std::string)安全:C++17 起 guaranteed copy elision,不会额外拷贝 - 返回大对象建议用
const &接收(如果函数返回的是左值),但注意:const &r = func();中若func()返回临时量,绑定后生命周期延长至r生命周期结束 - 返回
new出来的指针?别这么做——没配delete就内存泄漏,建议用std::unique_ptr - 返回
void函数不能用在表达式里,比如if (f())会编译失败
为什么函数重载和默认参数容易踩坑
重载不是“名字一样就行”,编译器要能唯一确定调用哪个;默认参数也不是“写上就自动补”,它只在调用点生效,且不能跳着写。
立即学习“C++免费学习笔记(深入)”;
- 重载函数参数类型太接近(比如
int和double)可能引发二义性:f(5)同时匹配f(int)和f(double),报错call to 'f' is ambiguous - 默认参数必须从右往左连续提供:
void g(int a, int b = 1, int c = 2)合法;但g(1, , 3)是语法错误,C++ 不支持“跳过中间参数” - 头文件里改默认参数值,所有包含它的源文件必须重新编译,否则旧目标文件仍用老默认值——这问题很难 debug
- 模板函数 + 默认参数更复杂,优先考虑用函数重载替代
return 的位置、返回类型和实际返回表达式是否严格匹配,比语法看起来更敏感;尤其涉及隐式转换、模板推导或 auto 返回类型时,稍不注意就会触发意外的类型降级或编译失败。








