C/C++知识点之C++中的函数及参数介绍
小标 2019-03-01 来源 : 阅读 582 评论 0

摘要:本文主要向大家介绍了 C/C++知识点之C++中的函数及参数介绍,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了 C/C++知识点之C++中的函数及参数介绍,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

C/C++知识点之C++中的函数及参数介绍

函数的概念


函数是一组一起执行一个任务的语句。每个 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++编译是通过对函数进行换名,将参数表的信息整合到新的函数名中,解决函数重载与名字冲突的矛盾。


通过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


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


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关键字也会被编译器忽略。

   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程