函数是一组一块儿执行一个任务的语句。每一个 C++ 程序都至少有一个函数,即主函数 main() ,全部简单的程序均可以定义其余额外的函数。ios
你能够把代码划分到不一样的函数中。如何划分代码到不一样的函数中是由你来决定的,但在逻辑上,划分一般是根据每一个函数执行一个特定的任务来进行的。ide
函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。函数
C++ 标准库提供了大量的程序能够调用的内置函数。例如,函数 strcat() 用来链接两个字符串,函数 memcpy() 用来复制内存到另外一个位置。优化
函数还有不少叫法,好比方法、子例程或程序,等等。spa
在相同的做用域,能够定义同名的函数,可是它们的参数要有所区分,这样的函数构成重载关系,此外函数之间可否构成重载和返回值无关。code
小例子:递归
#include <iostream> using namespace std; void foo(int a) { cout << "foo(int)" << endl; } void foo(int a, int b) { cout << "foo(int, int)" << endl; } int main() { foo(1); foo(2, 3); return 0; } 返回结果: foo(int) foo(int, int)
C++编译是经过对函数进行换名,将参数表的信息整合到新的函数名中,解决函数重载与名字冲突的矛盾。内存
经过nm查看目标文件中函数换名后的名字:ci
源文件的内容: void func(int a, int b) {} void func(int a, int b, int c) {} 生成目标文件: F:\c_projects\20181011_01>g++ -c demo3.cpp 查看目标文件信息: F:\c_projects\20181011_01>nm demo3.o 00000000 b .bss 00000000 d .data 00000000 r .eh_frame 00000000 r .rdata$zzz 00000000 t .text 00000000 T __Z4funcii // 修改后的第一个函数 00000006 T __Z4funciii // 修改后的第二个函数
当你打算让你的C程序去调用C++的程序的时候,是没法直接去函数的,由于C++的编译器会将函数修更名字,固然如果直接调用C++编译器修改后的名字也是能够的。作用域
也能够在函数声明的时候加入extern "C",这样是要求C++编译器不对函数作换名,便于C程序去调用,可是这样的函数没法实现重载。
实例:
extern "C" void func(..){..} extern "C" { void func1(..){..} void func2(..){..} ... }
能够为函数的部分或所有形参指定缺省值,调用该函数时,若是不给实参,就取缺省值做为相应形参的值。
例如:
#include <iostream> using namespace std; void func(int a = 1, int b = 2, int c = 3) { cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "c = " << c << endl; } int main() { func(); // 当没有给函数传递参数的时候,函数的参数取的是默认给的值 return 0; } 结果是: a = 1 b = 2 c = 3
缺省参数必须靠右,若是一个参数带有缺省值,那么右侧的全部参数都必须带有缺省值。
void func(int a = 10, int b = 20);//ok void func(int a, int b = 20);//ok void func(int a = 10, int b);//error
若是函数的定义和声明分开,缺省参数应该写在函数的声明部分,而定义部分不写。
声明: void func(int a, int b = 100, int c = 200); 定义: void func(int a, int b, int c) {};
void func(){函数体}//函数定义
void func();//函数声明
只有类型没有变量名的形参称为哑元参数。
例如:
void func(int){};
哑元参数由于没有变量名所以是不须要也不能被调用的。
通常在兼容旧代码的时候会用到。
实例:
#include <iostream> using namespace std; void func(int a, int) { cout << "哑元参数" << endl; } int main() { func(10, 20); return 0; }
使用inline关键字修饰的函数,表示这个函数是内联函数,编译器将会尝试作内联优化,避免函数调用的开销。
实例:
inline void func(...) {};
内联函数仅适用于小而简单的函数,调用次数不多或者大而复杂的函数,不适合作内联,例如递归函数。
此外内联优化知识一种建议而不是要求,可否内联主要取决于编译器,有些函数不加inline关键字也会进行内联优化,而有些函数即使加了inline关键字也会被编译器忽略。