函数定义必须明确返回类型、函数名和参数列表,漏写返回类型或参数类型会导致编译失败;调用前须声明或定义;参数传递需区分传值、传引用与传指针;main函数签名固定为int main()或int main(int, char**),不可重载或修改。

函数定义必须写清楚返回类型、名字和参数列表
不写返回类型(比如漏掉 int 或 void)会导致编译失败,C++ 不允许隐式 int。函数名不能是关键字,也不能和已声明的变量同名。参数列表里每个参数都要带类型,void func(int a, b) 是错的——b 缺少类型,得写成 void func(int a, int b)。
常见错误现象:error: 'xxx' declared as function returning a function,通常是返回类型写成了函数形式(比如写了 int() 而不是 int);或者把分号错放在函数体前,导致变成函数声明而非定义。
- 如果函数不返回值,必须显式写
void,不能省略 - 参数用逗号分隔,类型和名字都不可缺,
std::string s是合法参数,s单独写不行 - 定义时大括号
{}里是函数体,空函数也得有{},不能只写个分号
调用函数前必须确保它已被声明或定义
直接在 main() 里调用一个还没出现的函数,会报 error: 'xxx' was not declared in this scope。解决方法有两个:要么把函数定义写在 main() 前面;要么在 main() 上方加函数声明(原型),例如 int add(int a, int b);。
使用场景:多人协作时头文件里通常只放声明,实现放在 .cpp 文件里;单文件小项目可以直接定义在 main() 前。
- 声明末尾要加分号,定义不用
- 声明和定义的返回类型、函数名、参数类型顺序必须完全一致,连
const和引用符号&都不能漏 - 如果参数是自定义类类型,声明时用前向声明可能不够,需包含对应头文件
传值、传引用、传指针的区别直接影响函数内能否修改实参
默认是传值:函数内改形参,不影响原始变量。想让修改生效,得用引用(int&)或指针(int*)。但别乱加 &——比如对字面量或临时对象取引用(func(5) 调用形参为 int& 的函数)会编译失败。
性能影响:传大对象(如 std::vector)时,传值会触发拷贝,开销大;传 const 引用(const std::vector<int>&</int>)既安全又高效。
-
void f(int x):安全但无法反向修改调用者的x -
void f(int& x):能修改,但不能传字面量、表达式结果等非左值 -
void f(const int& x):既能接收任意int类型实参,又避免拷贝,最常用
main 函数是特例,签名固定且不能重载
合法的只有两种签名:int main() 和 int main(int argc, char* argv[])(或等价的 char**)。写成 void main() 看似能编译,但不符合 C++ 标准,某些平台会拒绝链接或运行异常。
容易被忽略的地方:即使你不处理命令行参数,也别擅自改成 void main;返回值 0 表示成功,非零一般表示错误,操作系统靠这个判断程序状态。
- 不能把
main定义在类里,也不能加static或inline - 不能递归调用
main,标准明确禁止 - 如果没写
return语句,C++11 起会自动补return 0;,但显式写出更清晰
函数体内的逻辑自由度很高,但定义语法、调用前提、参数传递方式这三块边界非常硬——写错一个符号或漏一个 const,编译器就立刻打断你。实际写的时候,先敲声明/定义骨架,再填内容,比边写边猜类型稳妥得多。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











