初识C++--------------缺省参数,函数重载及引用

缺省参数:

1)定义:C++相对于C语言来说,函数参数检测更加严格。缺省参数指的是在声明或者定义函数时为函数的参数指定一个默认值,在调用函数时,若没有指定实参就采用默认值,否则使用指定的实参
 
 

2)分类

全缺省参数,就是所有参数都指定了一个默认值:如下
void test(int a = 10, int b = 20, int c = 30)
{
	cout << a << " " << b << " " << c << endl;
}
int main()
{
	test();//10  20  30
	test(40);//40  20   30
	test(40, 50);//40  50  30
	test(40, 50, 60);//40  50  60
	return 0;
}

半缺省参数,部分参数指定了默认值:如下

 
 
void test(int a, int b = 20, int c = 30)
{
	cout << a << " " << b << " " << c << endl;
}
int main()
{
	test(40);//40  20   30
	test(40, 50);//40  50  30
	test(40, 50, 60);//40  50  60
	return 0;
}

注意
(1)带缺省值的参数必须放在参数列表的最后面
(2)缺省参数不能同时在函数声明和定义中出现,只能二者则其一
(3)缺省值必须是常量或者全局变量
(4)C语言不支持
函数重载:
1)定义:函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数、类型、顺序)必须不同,常用来处理实现功能类似数据类型不同的问题
注意:当两个函数只有返回值类型不同不可以构成函数重载
2)C语言不支持函数重载是因为函数调用约定
如下代码:
 
 
int Add(int left, int right)
{
	return left + right;
}


double Add(double left, double right)
{
	return left + right;
}

long Add(long left, long right)
{
	return left + right;
}

int main()
{
	Add(10, 20);
	Add(10.0, 20.0);
	Add(10l, 20l);
	return 0;
}

在C++(_cdecl调用约定)中三个Add函数再底层被解析为:

"int __cdecl Add(int,int)" (?Add@@YAHHH@Z)
"double __cdecl Add(double,double)" (?Add@@YANNN@Z)
"long __cdecl Add(long,long)" (?Add@@YAJJJ@Z)
在C语言中被解析为_Add,三个一样,所以不能进行区分,因此C语言不支持函数重载
3)C++中可以通过在函数声明前加  extern “C” 将一个函数按照C语言的风格来进行编译

引用:
1) 引用不是新定义一个变量,而是给已存在的变量起了一个别名,编译器不会为引用变量开辟空间,它和它引用的变量共用同一块内存空间
类型& 引用变量名(对象名)=引用实体

2)引用的特性
(1)引用在定义时必须初始化
(2)一个变量可以有多个引用
(3)引用一旦引用一个实体,再不能引用其他实体
void TestRef()
{
	int a = 10;
	int b = 20;
	//int &ra;//编译错误,对应(1)特性
	int& ra = a;
	//int& ra = b;//编译错误,对应(3)特性
	int& rra = a;
	cout << &a << " " << &ra << " " << &rra;
}

3)数组也可以进行引用
int main()
{
	int array[10];
	int (&rarray)[10] = array;
	cout << array << " " << rarray << endl;
	return 0;
}

4)使用场景
(1)作为函数参数
void Swap(int& left,int& right)
{
   int temp=left;
   left=right;
   right=temp;
}

(2)作为函数返回值
注意:不能返回栈上的空间
int& Add(int a, int b)
{
	int c = a + b;
	return c;
}
int main()
{
	int& ret = Add(10, 20);
	cout << ret << endl;//30
	cout << ret << endl;//随机值
	return 0;
}

5)效率:传值<传址<传引用
6)引用和指针的区别
相同点:底层的实现方式相同,都是按照指针的方式来实现的
不同点
(1)引用在定义时必须初始化,指针没有要求
(2)一旦一个引用被初始化为指向一个对象,就不能再指向其他对象,而指针可以在任何时候指向任何一个同类型对象
(3)没有NULL引用,但有NULL指针
(4)在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数
(5)引用自加改变变量的内容,指针自加改变了指针指向
(6)有多级指针,但是没有多级引用
(7)指针需要手动寻址,引用通过编译器实现寻址
(8)引用比指针使用起来相对更安全  

猜你喜欢

转载自blog.csdn.net/zimituanzi_/article/details/80636997
今日推荐