Float area(float r=6.5);
Area() //相当于area(6.5);
Area(7.5) //形参得到的值是7.5,而不是6.5。
这样做可以简化程序,提高运行效率。
例如:float volume(float h,float r=12.5);
Volume (45.6) //程序相当于volume(45.6,12.5);
Volume(34.2,10.4) //程序相当于h=34.2,r=10.4;
注意:实参与形参的结合是从左到右进行的。因此制定默认值的参数必须放在形参表列中的最右端。
例如:
void f1(float a,int b=0,int c,char d='a')//这是不正确的
void f2(float a,int c,int b=0,char d='a')//这才是正确的
如果要调用上面的f2函数,可以采取下面的形式:
f2(3.5,5,3,x) //形参的值全部从实参中得到
f2(3.5,5,3) //最后一个形参的值取默认值'a';
f2(3.5,5) //最后2个形参的值取默认值,b=0,d='a';
在使用带有默认参数的函数时有两点需要注意:
1.如果函数的定义在函数调用之前,则应在函数定义中给出默认值。
2.一个函数不能即作为函数重载,又作为有默认参数的函数。
变量的引用。
引用就是别名。
&是“引用声明符”。
例如:int a; int &b=a//声明b是一个整型变量的引用变量,它被初始化为a。例如:int a1,a2;
int &b=a1; //使b成为变量a1的引用。
int &b=a2; //又企图使变量b成为变量a2的引用是不行的。
引用的简单应用:
#include <iostream>
using namespace std;
int main()
{
int a=10;
int &b=a; //声明b是a的引用
a=a*a; //a的值变化了,b的值也应该一起变化
cout<<"a="<<a<<" "<<"b="<<b<<endl;
b=b/5; //同理b的值发生了变化,a的值也应一起变化
cout<<"a="<<a<<" "<<"b="<<b<<endl;
return 0;
}</strong></span>
输出结果:
a=100 b=100
a=20 b=20。
注意:不要把声明语句“int &b=a”理解为:“将变量a的值赋给引用b”,他的作用是使b成为a的引用,即a的别名。
使用指针实现两个值得互换:
#include <iostream>
using namespace std;
void swap(int *p1,int *p2)
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
int main()
{
int i=3,j=5;
swap(i,j);
cout<<i<<","<<j<<endl;
}
利用“引用实参”实现两个变量的值互换:
#include <iostream>
using namespace std;
void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
int main()
{
int i=3,j=5;
swap(i,j);
cout<<i<<","<<j<<endl;
}
这两个程序看着差别不大,而且都能出现正确结果。但是在以后的学习中你会发现,指针容易出错,而且不容易调试,需要使用运算符“*”(有时还会使用“->”运算符)去访问有关变量,比较麻烦。
对引用的进一步说明:
1.不能建立void类型的引用,如:
Void &a=9;//错误
因为任何实际存在的变量中都是属于非void类型的,void的含义是无类型或者空类型,void只是在语法上相当于一个类型而已。
2.不能建议引用的数组,如:
Char c[6]=“hello”;
Char &rc[6]=c; //错误
因为数组名c只代表数组首元素的地址,本身并不是一个占有存储空间的变量。
3.可以将变量的引用的地址赋给一个指针,此时指针指向的是原来的变量。
Int a=3;
Int &b=a;
Int *p=&b;
相当于p指向变量a,作用相当于:int *p=&a;
但是不能写成: int &*p=&a;
4.可以建立指针变量的引用,如:
Int i=5;
Int *p=&i;
Int *&pt=p;
如果输出*pt的值,就是*p的值5;
5.可以用const 对引用加以限定,不允许改变该引用的值。如:
int i=5;
Const int&a=i;
a=3;//企图改变引用a的值,错误
但是它并不阻止改变引用所代表的变量的值,如:
i=3;//合法
6.可以用常量或表达式对引用进行初始化,但此时必须用const声明。如:
Int =5;
Const &a=i+3;//合法
用这种方法不仅可以用表达式对引用进行初始化,还可以用不同类型的变量对之初始化。如:
Double d=3.1415926;
Const int&a=d;//不会发生编译错误,但是输出a的值是3。
如果不加const 则会发生编译错误。
Double d=3.1415926;
int&a=d;//错误