今天在看鸡啄米的C++系列教程的时候学到了三个有趣的东西:引用调用、内联函数和带默认形参值的函数。
首先是引用调用:
引用调用据百度百科说是C++特有的概念。C++函数调用有三种方式:值调用、引用调用和地址调用。
引用调用时给变量取一个别名,在函数传参数时,和指针一样可以用来改变值。
例如下例:
void swap(int& m,int& n){
int t;
t=m;
m=n;
n=t;
}
其作用就和
void swap(int *m,int *n){
int t;
t=*m;
*m=*n;
*n=t;
}
是一样的,在函数调用时都可以真正改变变量的值。
但是在使用时,需要注意如下:
(a)声明一个引用时,必须同时对它进行初始化,使它指向一个已经存在的对象;
(b)一旦一个引用变量被初始化后,就不能改为指向其他对象。
但是,引用作为形参时,不用再类型说明时进行初始化,而是在函数调用是用实参对引用进行初始化,这时,引用就代表了实参的一个别名,任何对形参的操作也会直接作用于实参。这是因为在声明函数时,并不为形参分配存储空间,而是在函数调用时才为形参分配内存空间。
给一个引用调用的例子
// 5.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
void swap(int& m,int& n);
int _tmain(int argc, _TCHAR* argv[])
{
int a,b;
cout<<"Please enter tow positive numbers:"<<endl;
cin>>a>>b;
swap(a,b);
cout<<"a="<<a<<" b="<<b<<endl;
system("pause");
return 0;
}
void swap(int& m,int& n){
int t;
t=m;
m=n;
n=t;
}
调用的时候直接传int型变量就可以了,觉得挺神奇的。
分享一个关于int *、int&和int的区别的文章:
http://www.cnblogs.com/alephsoul-alephsoul/archive/2012/10/10/2719192.html
然后是内联函数:
内联函数很有趣的一点是它是函数,但是在编译的时候却不具备函数的性质。就好像是函数的一个外号,在编译时,调用内联函数不会发生控制转移,而是将函数体直接嵌入在每一个调用处。很像是宏替换,但是又比宏替换聪明一点。而且,它那么有趣的性质就是因为内联函数就是用来消除函数调用时的时间开销。
其形式为:inline 类型标识符 被调函数名(函数形参列表)
给一个内联函数的例子:
// 6.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
inline double calArea(double r){
return 3.14*r*r;
}
int _tmain(int argc, _TCHAR* argv[])
{
double r=3.0;
cout<<calArea(r)<<endl;
system("pause");
return 0;
}
使用内联函数有如下注意事项:
(a)在内联函数内不允许有循环语句和switch语句;
(b)内联函数只适合有1~5行的小函数,不能包含递归函数;
(c)内联函数的定义必须出现在内联函数第一次被调用之前,而且在定义时,要对函数进行实现。
否则的话。。。内联函数就会被编译器视为普通函数进行函数调用。
最后是带默认形参值的函数:
函数在声明的时候可以预先定义默认形参值。在调用的时候,如果给出实参,则用实参初始化形参,否则就用预先定义的默认形参值。
但是带有默认值的形参必须统一放在不带默认值的形参的右边。在函数调用的时候,从右到左对形参进行初始化。
还有就是在不同的作用域允许不同的默认形参值。
各种神奇。。。