C++中的函数及参数介绍

栏目: C++ · 发布时间: 5年前

内容简介:函数是一组一起执行一个任务的语句。每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。你可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由你来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。

函数的概念

函数是一组一起执行一个任务的语句。每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。

你可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由你来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。

函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。

C++ 标准库提供了大量的程序可以调用的内置函数。例如,函数 strcat() 用来连接两个字符串,函数 memcpy() 用来复制内存到另一个位置。

函数还有很多叫法,比如方法、子例程或程序,等等。

函数重载

简单介绍

在相同的作用域,可以定义同名的函数,但是它们的参数要有所区分,这样的函数构成重载关系,此外函数之间能否构成重载和返回值无关。

小例子:

#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++中的函数及参数介绍

函数重载的原理

C++编译是通过对函数进行换名,将参数表的信息整合到新的函数名中,解决函数重载与名字冲突的矛盾。

通过nm查看目标文件中函数换名后的名字:

源文件的内容:

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

C++中的函数及参数介绍

缺省参数必须靠右,如果一个参数带有缺省值,那么右侧的所有参数都必须带有缺省值。

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 << "哑元参数\nLinux公社www.linuxidc.com" << endl;

}

int main() {

func(10, 20);

return 0;

}

C++中的函数及参数介绍

内联函数

使用inline关键字修饰的函数,表示这个函数是内联函数,编译器将会尝试做内联优化,避免函数调用的开销。

实例:

inline void func(...) {};

内联函数仅适用于小而简单的函数,调用次数很少或者大而复杂的函数,不适合做内联,例如递归函数。

此外内联优化知识一种建议而不是要求,能否内联主要取决于编译器,有些函数不加inline关键字也会进行内联优化,而有些函数即便加了inline关键字也会被编译器忽略。

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址: https://www.linuxidc.com/Linux/2018-10/155060.htm


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

你凭什么做好互联网

你凭什么做好互联网

曹政 / 中国友谊出版公司 / 2016-12 / 42.00元

为什么有人可以预见商机、超越景气,在不确定环境下表现更出色? 在规则之外,做好互联网,还有哪些关键秘诀? 当环境不给机会,你靠什么翻身? 本书为“互联网百晓生”曹政20多年互联网经验的总结,以严谨的逻辑思维分析个人与企业在互联网发展中的一些错误思想及做法,并给出正确解法。 从技术到商业如何实现,每个发展阶段需要匹配哪些能力、分解哪些目标、落实哪些策略都一一点出,并在......一起来看看 《你凭什么做好互联网》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器