内联函数
为提高c++程序运行速度所做的一项改进。代价是占用更多的内存,对于内敛代码,程序无需跳到另一个位置执行代码,要使用内联函数,须在
- 在函数声明前加上关键字inline
- 在函数定义前加上关键字inline
- 通常的做法是省略原型,将所有函数放在原型该在的地方
- 内联函数不能递归。
#include<iostream>
using namespace std;
inline double square(double x)
{
return x * x;
}
int main()
{
double a, b;
double c = 13.0;
a = square(5.0);
b = square(4.5 + 7.5);
cout << "a=" << a << ",b=" << b << endl;
cout << "c=" << c;
cout << ",c squared=" << square(c++) << endl;
cout << "now c=" << c << endl;
system("pause");
return 0;
}
注:用整个函数充当了函数的原型,宏定义中的参数传递不能按值传递。
#define square(x) x*x
a=square(5.0);//对的返回的是5*5
b=square(1+2)返回的是1+2*1+2//错误的,加括号也是错误的
这里的目的不是演示如何编写c宏,而是指出如果c语言的宏执行了类似的功能,应该考虑使用内联函数。
引用变量
c++新增的一种复合类型,引用变量。
创建引用变量
c++使用取地址符号&来声明引用,定义引用变量时对它进行初始化。
int i;
int &i=j;
j将i作为j变量的别名,将i和j互换,它们指向的是相同的内存单元。&不是取地址符号,而是类型标识符的一部分,char*是指向char的指针,int&指的是指向int的引用。
#include<iostream>
using namespace std;
int main()
{
int rats = 101;
int& rodents = rats;
cout << "rats= " << rats;
cout << ",rodents=" << rodents << endl;
rodents++;
cout << "rats=" << rats;
cout << ",rodents=" << rodents << endl;
cout << "rats address=" << &rats;
cout << ",rodents address=" << &rodents << endl;
system("pause");
return 0;
}
rodents++则将一个有两个名称的变量进行加1.
将引用作为函数参数
引用作为函数参数时,使得函数中的变量名称为调用程序中的变量的别名,这种传递参数的办法是按引用传递。
- 传递引用和传递指针作为被调用函数时可以交换两个值,但是按值传递作为函数调用时不能交换两个数,因为变量是赋值了主要函数的相关变量。
引用的属性和特别之处
默认参数
默认参数是指当函数调用时省略了其中的实参时自动使用的一个值。
#include<iostream>
using namespace std;
void show(string name, string id, string university)
{
cout << name << endl;
cout << id << endl;
cout << university << endl;
}
int main()
{
void show(string name, string id, string university = "南京大学");//设置了默认参数
//不能同时在函数的定义和函数的声明进行默认函数的设置,只能是其中一个
//必须从右至左设置默认参数,可以将不常改变的参数放在右边设置其为默认参数,
show("小张","001", "清华大学");
show("小王","002");
show("小力","003");//可以用默认参数减少代码量
system("pause");
return 0;
}
函数重载-函数多态
允许在程序中出现同名的函数,但是实现相同或者是相似功能,也就是函数多态,例如取一个函数名求和,求两数之和三数之和或者n数之和,设置它们为不同的参数即可,到时查阅手册调用该函数名就知道是求和函数,只是参数列表不同。
- 参数列表也叫函数特征标。如果函数的参数数目和类型相同,同时参数的排列顺序也相同,则它们的特征标相同,而与它们的变量没有关系。
-
(int a,int b); (int b,int c);//是同一函数,函数重载要求特征标不同
getsum(int a,int b);
getsum1(int a,int b,int c);
它们可以统称为getsum,则表示函数重载
- c++中显示同一函数则报错。
- 函数必须在相同的作用域函数才可以重载
- 函数的返回值不可以作为重载的条件
- 在特征标中,函数类型可以相互转换int变double
函数模板-function template
#include<iostream>
using namespace std;
template<typename t1,typename t2>
t1 getmax(t1 a, t2 b)
{
return a > b ? a : b;
}
double getmax(double a, int b)//函数调用时先调用的是这个而不是模板函数
{
return a > b ? a : b;
}
int main()
{
cout << getmax(1, 2) << endl;
cout << getmax('a', 'b') << endl;
cout << getmax("abc","cad") << endl;
cout << getmax(1.1, 2.1) << endl;
system("pause");
return 0;
}
注:不同类型的函数可以使用函数模板。
复习题
- 哪种函数适合定义为内联函数?
只有一行代码的函数且非递归函数适合做内联函数。如果执行函数代码的时间比函数调用的时间长则只是省略一小部分时间,不适合使用内联函数。