float area(float r=6.5); //指定r的默认值为6.5。
area(); //相当于area(6.5)
area(7.5); //形参得到的值为7.5,而不是6.5
如果有多个形参,可以使每个形参都有一个默认值,也可以只对一部分形参指定默认值,另一部分不指定默认值。
实参与形参的结合是从左至右顺序进行的,因此指定默认值的参数必须放在形参表列中的最右端,否则出错。例如:
void f2(float a, int c, int b=0,char d='a'); //正确写法,默认值在形参表列中的最右端
//函数调用
f2(3.5, 5, 3, 'x') //形参的值全部从实参获得
f2(3.5, 5, 3) //******最后一个形参的值取默认值'a'
f2(3.5, 5) //最后两个形参的值取默认值,b=0,d='a'
注意:一个函数不能既作为重载函数,又作为有默认参数的函数。
1.3.7 变量的引用
1.引用的概念
在C++中,变量的“引用”就是变量的别名,因此引用又称为别名。
假如有一个变量a,想给它起一个别名b,可以这样编写:
int a;
int &b=a; //声明b是一个整型变量的引用变量,它被初始化为a
这就声明了b是a的“引用”,即a的别名。
对变量声明一个引用,并不另外开辟内存单元,b和a都代表同一变量单元。
当b作为了a变量的引用后,不能再作为其他变量的引用。
2.引用的简单实用
#include<iostream>
using namespace std;
int main()
{
int a=10;
int &b=a; //声明b是a的引用
a=a*a; //a的值变化了,b的值也应一起变化
cout<<a<<b<<endl;
b=b/5; //b的值变化了,a的值也应一起变化
cout<<b<<a<<endl;
system("pause");
return 0;
}
3.关于引用的简单说明
引用及被引用对象必须是相同类型,即整型对整型,浮点对浮点。
引用与其所代表的变量共享同一内存单元,系统并不为引用另外分配分配存储空间。
当&a的前面有类型符时(如int &a),它必然是对引用的声明;如果前面没有类型符(如p=&a),此时的&是取地址运算符。
当b作为了a变量的引用后,不能再作为其他变量的引用。
b是a的引用,c也可以是b的引用,即可以用一个引用初始化另一个引用,其中a,b,c是同一地址;但存在一个疑问,书上显示“整型变量a有两个别名,即a和b”,为什么a的别名不是b和c?不知是书上的错误还是理解不够深刻。经过测试,a,b,c的空间地址是相同的。
代码如下:
#include<iostream>
using namespace std;
int main()
{
int a=3;
int &b=a;
int &c=b;
cout<<&a<<" "<<endl; //输出a的内存地址
cout<<&b<<" "<<endl; //输出b的内存地址
cout<<&c<<" "<<endl; //输出c的内存地址,结果显示a,b,c的地址相同
system("pause");
return 0;
}
4.将引用作为函数参数
4.1.将变量名作为实参
例1.10 无法实现两个变量的值互换的程序
#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; //3,5 不能实现互换
system("pause");
return 0;
}
变量作为实参不能互换
程序分析:在本例中,a和b开辟临时空间,a和b的空间换了,但i和j的内存空间不变,随着程序结束,a和b的内存被释放。
4.2.传递变量的指针
例1.11 使用指针做形参,实现两个变量的值的互换
#include<iostream>
using namespace std;
void swap(int *p1,int *p2)
{
int temp;
temp = *p1;
*p1=*p2;
*p2=temp;
}