<9> 函 数

函数可以说是C/C++或者其他高级程序设计语言中最重要的概念之一吧。与函数相关的包括普通函数,内联函数,静态成员函数,类的成员函数,模板函数,函数指针,函数调用,友元函数,函数的声明,函数的定义,形参,实参,函数的重载 ··· 一个一个来吧。

1 . 普 通 函 数

普通函数一般仅仅是为了作为实现某些公式或者功能而封装起来的一段代码。我们把在函数中传递的类型参数叫做形参,传递的实际值叫做实参,形参可有可无,返回的类型叫做返回类型,如果没有返回类型,就写成void。

// 普 通 函 数 ( 没有形参,没有返回值 )
void Function1() {
	std::cout << "Hello World" << std::endl;
}


// 普 通 函 数 ( 有形参,没有返回值 ) 
void Funtion2(size_t Counts) {
	for (size_t i = 0; i < Counts; i++)
		std::cout << "Hello World" << std::endl;
}


// 普 通 函 数(有形参,有返回值)
int Funtion3(size_t Counts){
	return std::pow(Counts, 2);
}


// 普 通 函 数(没有形参,有返回值)
int Funtion4() {

	int sum = 0;
	for (size_t i = 1; i <= 100; i++){
		sum += i;
	}

	return sum;
}
四个很简单的普通函数,为了实现某个数学公式或者某个功能编写的。

2 . 内 联 函 数

我们在函数的前边加上“inline”关键字,就可以变为内联函数。但是我们为什么要给有的函数前边加上内联函数呢?有的函数却不适合加呢?

在函数执行的时候,普通函数的调用会跳转到另一个地址(函数的地址),在函数执行结束的时候返回,这样的函数跳转会有一定的开销,inline函数为我们提供了另外的一种选择。因为当你在调用inline函数时,编译器会将函数的代码替换函数调用,因此内联函数不需要来回跳转,所以内联函数一般比普通函数执行的速度快,不过它的代价是需要占用更多的内存空间。

如果说在函数中,执行的时间远比处理调用机制的时间长,假设我们把函数添加了inline关键字,节省的时间也仅仅是有限的,还可能会由于代码多个地方对于一个函数的调用多出来的副本,导致内存开销过大。如果执行的时间比处理条用机制的时间短,那么我们节省的时间就是处理调用的时间,加上inline函数确实是有效的。

// 内联函数
inline void Function4() {

	int sum = 0;
	for (size_t i = 0; i < 1000; i++) {
		sum += i;
	}
}
对于一个现代的计算机来说,浮点型计算已经是非常之快了,Function4主要是一个1000以内的求和,微秒之间就可以完成。因此,函数的执行花费的大部分时间均来自于函数的调用机制,给这种函数添加inline是合理的。但是,你看下边:

void Function5() {
	
	int sum = 0;
	while (sum<1000)
	{
		sum++;
		Sleep(1000);
	}
}
这样的函数体内,有一个Sleep的延迟函数,将while循环体内的执行过程拉长了至少1000s,因此inline函数在此地显得十分有限。

3 . 静 态 成 员 函 数 和 全 局 函 数

在一个类里边,函数的前边加上static,那么这个函数就是静态成员函数。如果有这么一个函数,不修改或者访问非静态的成员变量,那么这个函数还是被声明为静态的成员函数比较好。但是外部访问的时候,不是通过类的对象来访问,而是通过类名+作用域操作符。      

如果函数前面加了static修饰符,但是函数却不在类里边,那么这个函数就是一个全局的函数。

4 . 类的成员函数(这个随后再继续讨论)

5 . 函 数 模 板 
模板就是一个模子而已,搭好了框架,用来套。比如:现在我们有这么一个问题,计划开发一个计算器,很显然,计算器是有+-*/四则运算的。需要完成一个加法的功能,但是数据有整型,浮点型,等等。我们可以这么来写:

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


double sum(double a, double b) {
	return a + b;
}


long sum(long a, long  b) {
	return a + b;
}

// ···
我们来看上边的函数,感觉看起来都差不多,那么能不能写一个通用的程序,来代替以上的程序呢?于是,模板函数就出现了:

template<typename T>
T sum(T a, T b) {
	return a + b;
}
远远未完,待续。








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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值