cpp从0到1----函数

首先,谈到函数这个话题,什么是函数,函数就是人为写的方法,专门用于解决某类特殊问题。

函数的三要素分别为,返回值类型,参数列表和函数名。

这里我们着重探讨一下cpp和c语言中 函数的不同之处

一、在返回值类型方面

首先来看这段代码:

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>

func()
{
	return 1;
}

int main()
{
	
	return 0;
}

        

在c语言中,是支持没有返回值类型的函数的,因为在c语言中,默认函数返回值是int类型,但是在cpp中,对返回值检测更加严格,是不允许这种情况发生的!

如果将上述文件名后缀改为.cpp就会报错

所以,在返回值类型方面,cpp没有默认返回值类型,而且检测较为严格,但是c语言有默认返回类型,为int;

二、参数列表

1、参数列表位置在c语言中可以接受任意多个参数,

请看以下代码:

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>

int func()
{
	return 1;
}

int main()
{
	func();
	func(10);
	func(10, 20);
	func(10, 20, 100);
	return 0;
}

这样虽然在常人认为是错误的写法,居然在c语言中是编译通过的...但是在cpp中是无法通过编译的;

2、在cpp中函数的参数列表是接受默认值的

这里就要引入一个新的概念:缺省参数,也就是带默认值的参数

请看以下代码:

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>

int func(int a = 0)
{
	return 1;
}

int main()
{
	func();
	func(10);
	
	return 0;
}

在cpp中,这样是合法的,而且在运行过程中,如果没传参数,会将该位置自动传上默认值;

当断点打在func()上的时候,没有传参数,但是也能通过编译,并且将默认值0赋值给了形参!

而当断点打在func(10)上的时候,因为已经传了参数,所以这个默认值直接忽略就行;

如果一定要用一个现实的例子来举例的话,那这个缺省参数就是备胎,当没有实参传入的时候,备胎就上线;而当有实参传入的时候,备胎就走开;虽然比较悲惨,但是就这么记忆吧hh

含有缺省参数的函数叫做缺省函数,缺省函数分为全缺省函数和半缺省函数,在半缺省函数中,缺省参数只能从右到左依次排列,不能中间出现不缺省参数,不能间隔出现!

而且在涉及到又有对函数的声明又有对函数的定义时,规定只能有一处出现缺省参数的默认值!

这里举个例子就比较好理解了

看以下的代码:

如果这么写,也就是将默认值赋值部分写在了声明,那么定义部分没出现就是正确的;

这样出现在函数的定义中也是正确的

但是如果同时出现,

其实这样是为了避免出错如果声明和定义中给出的默认值不一样,那到底该听谁的呢???

而且建议给在函数的声明,因为如果放在具体函数的实现中,如果一旦要修改,它的工作量可就视工程的浩大程度而定了.. 其实如果不怕麻烦,放在哪里都可以...毕竟声明和定义都和具体指无关,只需要这个变量而不是这个值

3、缺省值也可以赋值为全局变量

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>

int g = 0;

int func(int a = g)
{
	return 1;
}

int main()
{
	func();
	func(10);
	
	return 0;
}

这点很好理解,不解释了。

三、函数名的区别

在cpp中,是可以存在多个“相同”的函数的,注意这里相同打了双引号,代表不是完全相同,

引入一个新的概念叫:函数重载,重载的另一个意思叫多义词;

也就是函数的多义字,可以有一个名字,多个意思;

函数重载:多个函数有相同名字,但是参数列表不同的函数

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
int add(int l, int r)
{
	return l + r;
}

double add(double l, double r)
{
	return l + r;
}

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

比如这里的add函数就进行了重载

函数重载可以实现一个函数多个功能,避免了想函数名字的苦恼..

但是要记住只有返回值不同的函数是构不成重载的!

那么我们不妨想一想为什么cpp中支持函数重载但是c语言中不支持函数重载?

因为cpp和c语言使用的编译器是不一样的,它们对于函数的处理方式不一样的;

c语言编译的时候,将函数名处理为 下划线 + 函数名 或者有的再加上 @ 和其参数字节数

但是cpp在编译时,将函数名处理为 以问号打头,中间是函数名,以@作为函数名的结尾;后跟YA,接返回值+参数类型 ,以Z结尾 

(有想理解的可以自行搜索..我只记得这些了)

其实也就是cpp在任何系统下的编译器都多了一步对函数参数和返回值的解释;

虽然但是,还是不可以 以返回值作为参数的返回值!!!!!!!!!!!

不信看图好吧

 ok 函数结束..

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值