【C->Cpp】深度解析#由C迈向Cpp(2)

目录

(一)缺省参数

全缺省参数

半缺省参数

 缺省参数只能在函数的声明中出现:

小结:

 (二)函数重载

函数重载的定义

 三种重载


        在上一篇中,我们从第一个Cpp程序为切入,讲解了Cpp的命名空间要解决的问题,以及输入输出流。

        接下来,开始本篇内容->


长长的路,慢慢的走 


(一)缺省参数

 

       缺省参数是Cpp另一个基于C上的新增加的语法,实现一个项目,离不开一个一个的功能,为了更加方便的重复使用同一个功能,我们通常将代码段封装成“高内聚,低耦合”的函数中。

        想要使用函数,一般要向他传递参数。在C中,我们必须按照函数定义时的参数一一对应的传参:

​#include<stdio.h>

float sub(float a,int b)
{
	return (float)(a-b);
}

int main()
{
	printf("%lf\n",sub(5.6,4));
	
	return 0;
}

        在Cpp中,有缺省参数的语法:

在函数定义的时候,给参数一个值,这个值是“备用的”,如果这个在调用此函数时,没有给参数传值,那么这个参数就会使用这个设定的默认值。

 


#include<iostream>

int func(int a = 50)
{
	return a;
}
int main()
{
	std::cout << func(10) << std::endl;
	std::cout << func() << std::endl;
	return 0;
}

a默认值为50,有传值按照传递的值;无传值则默认为50. 

 缺省参数按照缺省的情况不同,分为全缺省参数和半缺省参数


 

全缺省参数

 在定义函数的时候,所有的参数都有默认值

//在定义的时候,对所有的参数设置有默认值

void fun_c(int a = 1,int b = 2,int c = 3)
{
	std::cout << "a = " << a << std::endl;
	std::cout << "b = " << b << std::endl;
	std::cout << "c = " << c << std::endl;
}

 


半缺省参数

在定义函数的时候,部分参数有默认值

//部分参数有默认值——第一个参数a没有默认值,其余参数有默认值

void fun_c2(int a,int b = 5,int c = 52)
{
	std::cout << "a = " << a << std::endl;
	std::cout << "b = " << b << std::endl;
	std::cout << "c = " << c << std::endl;
}

 

但是,有默认值的参数要放在函数定义的参数括号的最右侧,否则,编译器报错 

 

将有默认值的参数放到函数参数括号的右侧后,没有错误提示

 


 

 在使用的时候,由于有默认值的参数都放在函数的参数括号的最右侧,无默认值的参数在函数括号的左侧,所以手动传入的参数主要是给无缺省参数的参数。

 无法跨过没有默认值的参数,直接给有默认值的参数传参


void func2(int a ,int b = 5, int c = 8)
{
	std::cout << "a = " << a << std::endl;
	std::cout << "b = " << b << std::endl;
	std::cout << "c = " << c << std::endl;
	std::cout << std::endl;
}

int main()
{
	func2(,1,2);
	func2(1,2);
	return 0;
}

 


 缺省参数只能在函数的声明中出现:

在项目内部时,缺省参数统一放在函数的声明中 

 main.cpp


#include"test.h"

int main()
{
	std::cout << add(1,2) << std::endl;
	std::cout << add() << std::endl;
	
	return 0;
}

add.h

#ifndef TEST_H
#define TEST_H

int add(int a = 1,int b = 1);

#endif

 add.cpp


int add(int a,int b)
{
	return a+b;
}

 编译成功,按照传入参数,和为3;按照默认参数,和为2;


对其他情况:

        在定义中设置默认参数;

        在定义和声明中都设置默认参数;

都无法编译通过。 

 只有在声明中设置默认参数,编译可以成功;


小结:

        1.半缺省参数(有默认值的参数)必须从右向左来给出,不能间隔着给;

         2.缺省参数不能在函数的声明和定义中同时出现,要将缺省参数放在声明中。

 

 (二)函数重载

在C中,我们无法定义任何一个同名的函数。当我们想要实现一系列功能类似,知识数据类型不同的函数时,我们只能在函数名上附带上一些标记:

add_int();
add_dou();
add_flo();
...

这就不利于我们编程。因为当函数类型更多时,记忆十分繁琐。

函数重载是Cpp为了方便编程,在C的基础上添加的新的语法。

 

函数重载的定义

函数重载是在同一个作用域中,可以声明几个功能类似的同名函数,但是需要满足的条件是:函数的形参列表不同->

        具体来说,形参列表不同指的是 参数个数,类型,类型顺序不同

 三种重载

 

 类型不同


int add_(int a,int b)
{
	return a+b;
}
double add_(double a,double b)
{
	return a+b;
}

int main()
{
	std::cout << add_(1,2) << std::endl;
	std::cout << add_(1.5,2.6) << std::endl;
	
	return 0;
}

 

参数个数不同


int add_(int a,int b)
{
	return a+b;
}

int add_(int a,int b,int c)
{
	return a+b+c;
}


int main()
{
	std::cout << add_(1,2) << std::endl;
	std::cout << add_(3,5,9) << std::endl;
	
	return 0;
}

 

 类型顺序不同


void fun_c4(int a,char c)
{
	std::cout << a << std::endl;
	std::cout << c << std::endl;
}

void fun_c4(char c,int a)
{
	std::cout << a << std::endl;
	std::cout << c << std::endl;
}

int main()
{
	fun_c4(5,'v');
	fun_c4('p',5);
	return 0;
}

以上三种情况都是正确的,可以编译通过;编译器似乎可以自动识别函数的参数类型,他根据我们传入参数的类型来自动调用参数类型合适的函数。

 

但是为什么呢? 编译的时候,编译器是怎么识别的呢?

 与C不同的是,Cpp对函数名进行了不同的修饰,同名的函数,由于修饰的内容不同,所以最终Cpp编译器对于同名函数的名称能够区分开。

 

至于如何区分,具体请听下回解析~ 


完~ 

未经作者同意禁止转载 

相关推荐

  1. CPP Weekly --C++17

    2023-12-25 12:40:03       28 阅读
  2. c++】cpp之引用

    2023-12-25 12:40:03       13 阅读
  3. c++】cpp类和对象

    2023-12-25 12:40:03       11 阅读
  4. C#】与cpp异同总结

    2023-12-25 12:40:03       12 阅读
  5. <span style='color:red;'>Cpp</span>-<span style='color:red;'>2</span>

    Cpp-2

    2023-12-25 12:40:03      33 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-25 12:40:03       17 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-25 12:40:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-25 12:40:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-25 12:40:03       18 阅读

热门阅读

  1. [网络安全] NTFS权限

    2023-12-25 12:40:03       42 阅读
  2. 《PCI Express体系结构导读》随记 —— 前言

    2023-12-25 12:40:03       32 阅读
  3. Mybatis使用详解

    2023-12-25 12:40:03       40 阅读
  4. Linux 文件管理命令----pwd 命令

    2023-12-25 12:40:03       38 阅读
  5. C/C++编译问题

    2023-12-25 12:40:03       25 阅读
  6. (c语言)素数的判断方法

    2023-12-25 12:40:03       45 阅读
  7. 力扣labuladong——一刷day79

    2023-12-25 12:40:03       36 阅读
  8. qt的血泪教训——地图存储与绘制

    2023-12-25 12:40:03       40 阅读
  9. Redis-实战案例

    2023-12-25 12:40:03       47 阅读
  10. sql server 增删改查(基本用法)

    2023-12-25 12:40:03       38 阅读
  11. 【AI】人工智能本地环境集成安装

    2023-12-25 12:40:03       33 阅读
  12. 5G RedCap:轻量5G技术的新宠

    2023-12-25 12:40:03       40 阅读
  13. IP地址与MAC地址的区别与联系

    2023-12-25 12:40:03       33 阅读
  14. python 文本文件的读取

    2023-12-25 12:40:03       43 阅读