C++ 基础与深度分析 Chapter6 函数(函数基础、函数详解-参数、函数体、返回类型)

函数基础

在这里插入图片描述

int Add(int x, int y) // 形参 // 函数头
{
    return x + y; // 函数体
}

int main()
{
    cout << Add(2, 3) << endl; // 实参 函数调用
}
#include <iostream>
#include <string>
#include <vector>
using namespace std;
#include "header.h"

int Add(int x, int y); // 函数的声明,一个或多个,一般放在header文件中
int Add(int x, int y); // 函数的声明,一个或多个,一般放在header文件中

int main()
{
    cout << Add(2, 3) << endl; // 实参 函数调用
}

int Add(int x, int y) // 函数的定义
{
    return x + y; 
}

// x = 2
// y = 3
// 拷贝初始化
int Add(int x, int y) // 函数的定义
{
    return x + y; 
}

int main()
{
    cout << Add(2, 3) << endl; // 实参 函数调用
}

在这里插入图片描述
函数调用栈:
在这里插入图片描述
在这里插入图片描述
c语言不支持函数的重载,cpp支持。


// c语言形式的函数
extern "C"
int Add(int x, int y) // 函数的定义
{
    return x + y; 
}

// c语言形式的函数,不支持2个C语言的同名函数,因为不支持c语言不支持函数重载
extern "C"
int Add(int x) 
{
    return x + 1; 
}

int main()
{
    cout << Add(2, 3) << endl; // 实参 函数调用
}

函数参数

在这里插入图片描述


void fun(int x, int y)
{

}

void fun(int z, int y) // 形参名称的不同,并不能引入函数的重载
{
    
}

int main()
{
    cout << fun(2, 3) << endl;
}

void fun(int x, int y)
{
    cout << x + y << endl;
}


int main()
{
    fun(2, 3); // 2初始化x,3初始化y,顺序不定
}

在这里插入图片描述
在这里插入图片描述
传值

void fun(int par)
{
    ++par;
 }

int main()
{
    int arg = 3;
    fun(arg); 
    cout << arg; // 3 arg不会改变,我们只是把arg的值传给了par。
}

传址

void fun(int* par) // par是指针
{
    ++(*par);
 }

int main()
{
    int arg = 3;
    fun(&arg); 
    cout << arg; // 4 把arg的地址传给par
}

传引用

void fun(int& par)
{
    ++par;
 }

int main()
{
    int arg = 3;
    fun(arg); 
    cout << arg; // 4 传引用,par被绑定到了arg上,所以par的修改,影响arg
}

参数类型退化


void fun(int* par)
{
}

int main()
{
    int a[3];
    fun(a); // a拷贝初始化par,a退化成指向第一个元素的指针
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
为了防止类型退化,使用引用
在这里插入图片描述
变长参数
initializer_list:传入的类型必须是相同的,不涉及元素的拷贝,只是指针的拷贝。
在这里插入图片描述

#include <iostream>
#include <initializer_list>
using namespace std;

void fun(std::initializer_list<int> par) // 都必须是int类型的参数
{

}

int main()
{
    fun({1, 2, 3, 4, 5});
}

在这里插入图片描述
可变长度模版参数
后面讨论模版再详谈。

使用省略号
在这里插入图片描述
printf就是省略号实现的,他是c语言的,cpp中不建议用省略号,建议用initializer_list。
在这里插入图片描述
缺省实参:

void fun(int x = 0)
{
    cout << x << endl;
}

int main()
{
    fun(); //  0 缺省的实惨
    fun(1); // 1 
}

如果一个函数前面的参数定义了默认值,那么后面的参数也必须定义缺省值。否则不合法。
在这里插入图片描述
在这里插入图片描述
实参会按照从左到右,匹配形参。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
缺省实参为对象时,实参的缺省值会随着对象变化。

int x = 4;
void fun(int y = x)
{
    cout << y << endl;
}

int main()
{
    fun(); // 随着x的变化而变化
}

一般情况下,不要这么写,还是老老实实写函数的定义。不传对象。

main函数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以通过这个方法给main传递相应的参数。

函数函数体

在这里插入图片描述

void fun()
{
    cout << "Hello" << endl;
}

int main()
{
    fun(); // fun函数隐式返回,因为void
}
int fun()
{
    cout << "Hello" << endl;
}

int main()
{
    fun(); // warning: non-void function does not return a value [-Wreturn-type]
}

main函数的隐式返回是0.
除了main,其他所有函数,如果想使用隐式返回,必须写void。

显示返回,必须要写return返回。

void fun()
{
    cout << "Hello" << endl;
    return; // 显示返回,不会到}去隐式返回了
}

int main()
{
    fun();
}
int fun()
{
    cout << "Hello" << endl;
    return 100; 
}

int main()
{
    int x = fun();
    cout << x << endl; // 100,上面fun函数的返回值
}

return初始化列表:

std::vector<int> fun()
{
    cout << "Hello" << endl;
    return {1, 2, 3, 4, 5}; 
}

int main()
{
    auto x = fun();
    for (auto i : x)
    {
        cout << i << endl; // 1 2 3 4 5
    }
}

小心返回自动对象的引用和指针
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
返回值优化RVO:return value optimization
c++17引入的优化机制,是针对返回临时对象的。
在这里插入图片描述

函数返回类型

在这里插入图片描述
返回类型表明了函数计算结构的类型

int fun(int x, int y)
{
    return a + b; // 返回类型时int
}
int main()
{
   
}

void


void fun(int x = 1, int y = 2)
{
    cout << x << ' ' << y << endl;
    return; // 不返回任何类型
}

int main()
{
   fun();
}

上述都为经典方法,位于函数头部

C++11开始,位于函数尾部

auto fun(int x = 1, int y = 2) -> int
{
    return x + y;
}

在这里插入图片描述

自动推导
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
constexpr if 构造“具有不同返回类型”的函数

在这里插入图片描述
在这里插入图片描述
返回类型的结构化绑定
C++17

在这里插入图片描述
[[nodiscard]]属性
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值