我的《C++ primer》笔记第六章:函数

本文详细探讨了C++中的函数,包括函数基础、参数传递、返回类型、函数重载、特殊用途语言特性等内容。介绍了形参与实参的概念、函数返回类型、局部对象、函数指针的使用,以及如何利用引用避免拷贝和返回额外信息。强调了函数匹配和类型转换在函数调用中的重要性,并讨论了函数声明、默认实参、内联函数和constexpr函数的细节。
摘要由CSDN通过智能技术生成

函数

写在前面

函数,就是一个命了名的代码块。我们可以通过函数调用用它里面的代码。通常来说可以传入0-n个参数,产生一个结果。函数可以重载,所谓重载就是同一函数名,可以应对多个不同的函数。

很舒服啊,学完了这章,也可能是因为刚刚答辩完一科期末考核,很兴奋吧。所以呀,要继续加油!

6.1 函数基础

调用运算符括号()如 solve()

返回类型、形参、函数名字

主调函数、被调函数一般而言,return是将程序的控制权从被调函数移给主调函数。如果带值的话,还好将值也带进主函数。

形参和实参

实参是形参的初始值。要进行函数调用,实参的类型和个数必须要和形参进行匹对。这个匹对不用完全一样,如果实参可以转换成形参类型,则也可以进行函数调用。

函数的返回类型

函数的返回类型不能够是数组,但是可以是指向数组的指针。而其他大多数类型都可以被作为返回值类型

6.1.1局部对象

在C++中,有两个很重要的概念。

  • 名字有作用域
  • 对象有声明周期

函数体是一个语句块,块构成一个新的作用域。作用域里面的变量是局部变量,他仅对该块有用,在其他块当中会被隐藏。

所有函数体都有生命周期,他的生命周期,在被创造的一刻开始,在销毁的一刻结束。

自动对象

自动对象就代表的是,当程序进行到函数的控制路径的变量定义语句时创建,当到达定义所在的代码块末尾时销毁他。一旦函数终止,形参也就被销毁

局部静态对象

局部静态对象就是,在一段局部代码块定义的静态变量,当程序进行到定义语句的时候变量产生,并且这个变量的生命周期一直会持续到整个程序结束。

函数声明

和函数定义不同,声明可以多次,但定义只能一次。如果在整个程序中始终没有用到这个函数,那么也可以只声明不定义。

头文件中进行函数声明

函数声明可以放到头文件中,这样便于管理,但是也必须记住带有函数声明的头文件应该被包含在定义函数的头文件中

6.2 参数传递

有两种参数传递

  • 引用传递,形参绑定实参。形参的改变影响实参。通常被称为引用传递函数被传引用调用
  • 值传递,就是实参将值赋给形参,但是形参的改变不引起实参改变。
6.2.1 传值参数

在普通的传值参数里面,右值的改变有些时候并不影响左值。函数里面对普通形参的改变永远不会影响到实参

指针形参

指针和其他非引用类型一样,它只是那块定义的内存里面放了要指向一块变量地址的内存。如果这个指针重新指向了一个地址,那么这个指针原先指向的地址的值并不会发生改变。

int *p = nullptr;
int *q = nullptr;
int i = 10;
int n = 20;
p = &i;
q = &n;
p = q;//p指向q指向的地址,也就是n,但是i并不会发生改变
6.2.2 传引用参数

传引用参数就不同于传值参数了,如果是传引用参数,那么它的值的改变会影响原先值。因为引用是绑在一起的。

int n = 10;
int i = 100;
int &a = n;
a = i;//这时候n也会变成100

同样的,对于函数进行传引用参数,形参的改变也会影响到实参。

使用引用避免拷贝

如果在一个函数中,我们不需要改变形参的值,我们可以最好使用const引用。(这里有一个问题,就是为什么不需要改变形参的值,还要用常引用呢?后来想了想,万一实参是个引用怎么办呢?所以常引用还是有用的,然后实验了下,发现形参是非引用实参是引用还是可以通过的,所以又进入了疑惑?然后读到后面发现了如果函数形参是非常量引用他是不能够让右值也就是常量1等实参传入函数。所以我们在函数中要使用引用然后不改变他的值的时候,我们要用常量引用)

使用引用形参返回额外的信息

我们知道,在一个函数中只能返回0-1个值,如果我们要返回多个数值,就可以用到引用形参返回额外我们需要的信息。

int solve(int i , int &j)
{
   
    i = 100;
    j = 200;
    return i;
}

int main()
{
   
    int i = 0;
    int j = 0;
    i = solve(i , j);
    cout << i << " " << j << endl;//输出100和200
    return 0;
}
6.2.3 const形参和实参

当顶层const是形参的时候,他会去掉顶层const。从而会对同名函数会有点影响

//下面这两个函数会发生重名定义。
void solve(const<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒜蓉蒸大虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值