C++ 引用和函数的高级特性

304 阅读5分钟

引用

定义:变量的别名

引用的声明:类型标识符 &引用名=目标变量名;

引用的主要功能:作为函数的参数或返回值

void main(){
	int a = 10;
	int &b = a;
	cout <<"引用:"<< b << endl;
	getchar();
}

EventBus.png

说明:

1、一开始定义引用必须要赋值

2、引用的大小很像指针

3、引用的本质是:指针常量

C++.png

上图中,p = &b显示错误,是p保存的地址不能改变。

void modify(int &a){
	a = 200;
}

void modifyB(int * const a)
{
	*a = 150;
}

void main(){
	int a = 10;
	int b = 5;
	//指针常量(这个指针所保存的地址不能改变)
	int * const p = &a;
	//p = &b; //不能改变

	int x = 5;
	cout << x << endl;
	modify(x);
	cout << x << endl;
	modifyB(&x);
	cout << x << endl;


	getchar();
}

C++.png

函数

函数的使用通常包含以下几个步骤:

1)、函数声明:说明函数的名字、参数、返回类型。

说明:系统函数的声明通常放在头文件中

2)、函数调用:提供调用函数,实现相应功能,返回结果

result = square_sum(array, 5);

3)、函数定义

三种类型参数传递 1、值传递:(函数不能实现实参值交换功能)

void swap(int a, int b){
	int c = 0;
	c = a;
	a = b;
	b = c;
}
void main(){
	int a = 10;
	int b = 5;
	cout << "交换前:" << "a---->" << a <<" b---->"<< b << endl;
	swap(a,b);
	cout << "交换后:" << "a---->" << a << " b---->" << b << endl;
	getchar();
}

C++.png

2、指针传递:(实参、形参指向同一内存空间,函数能实现实参值交换功能)

void swap(int *a,int *b){
	int c = 0;
	c = *a;
	*a = *b;
	*b = c;
}

void main(){
	int a = 10;
	int b = 5;
	cout << "交换前:" << "a---->" << a <<" b---->"<< b << endl;
	swap(a,b);
	cout << "交换后:" << "a---->" << a << " b---->" << b << endl;
	getchar();
}

C++.png

3、引用传递:(形参是参数的别名,函数能实现实参值交换功能。形式更加直观)

void swap(int &a, int &b){
	int c = 0;
	c = a;
	a = b;
	b = c;
}
void main(){
	int a = 10;
	int b = 5;
	cout << "交换前:" << "a---->" << a <<" b---->"<< b << endl;
	swap(a,b);
	cout << "交换后:" << "a---->" << a << " b---->" << b << endl;
	getchar();
}

C++.png

内联函数(又称内置函数或内嵌函数)

内联函数与普通函数的区别:编译器直接将其函数代码插入到调用处。这样调用它时,就不会有压栈出栈问题(函数调用时用栈来传递参数和控制程序转移),因而其执行速度很快。

内联函数的声明与定义:在普通函数的基础上加inline关键字 (这并不意味着加了inline后就一定是内联函数)

inline void modify(int &a){
	a = 200;
}


void main(){
	int a = 10;
	int b = 5;

	modify(a);

	cout << a << endl;

	getchar();
}

说明: 使用内联函数是一种用空间换时间的措施,若内联函数较长,且调用太频繁时,程序将加长很多。因此,通常只有较短的函数(一般为5个语句以下)才定义为内联函数,对于较长的函数最好作为普通函数处理。

通常,内联函数还有如下的限制:

1)不能有递归;

2)不能包含静态数据;

3)不能包含循环;

4)不能包含switch和goto语句;

5)不能包含数组。 若一个内联函数定义不满足以上要求,则编译系统把它当作普通函数对待。

带有默认参数值的函数

C++还允许在函数声明或函数定义中为形参指定一个默认值。在调用此类含默认值形参的函数时,如果形参有对应的实参,则将实参传递给形参;如果省略了实参,则将上述默认值传递给形参。

void printa(int a = 20){
	cout << "a的值:" << a << endl;
}

void main(){
	int a = 10;
	int b = 5;

	printa();
	printa(a);//覆盖默认a的值

	getchar();
}

C++.png

如果函数有多个默认参数,则默认参数必须是从右向左定义,并且在一个默认参数的右边不能有未指定默认值的参数。(原因:编译器在实参与形参对应时是按从左到右顺序进行的)

特别注意:如果在函数原型的声明中设置了函数参数的默认值,则不可再在函数定义的头部重复设置,否则编译时将出错。

重载函数

C++允许用同一个函数名定义多个函数(即“一名多用”),这些函数的参数个数或参数类型不同。这就是函数重载(function overloading)。 优点:便于记忆

void printa(int a){
	cout << "a的值:" << a << endl;
}
void printa(float a, int b){
	cout << "a的值:" << a << endl;
}
void printa(double a,int b,int c){
	cout << "a的值:" << a << endl;
}
void printa(char* c, int a){
	cout << "a的值:" << a << endl;
}

void main(){
	int a = 10;
	int b = 5;

	printa(a);//覆盖默认a的值

	getchar();
}

区分依据标准:通过函数的参数个数、参数类型、参数顺序不同来区分

注意:重载函数的使用与普通函数类似,每一个函数都要进行声明与定义。

(4)注意事项:

1)不可以定义两个具有相同名称、相同参数类型和相同参数个数,只是函数返回值不同的函数

2)如果某个函数参数有默认值,必须保证其参数默认后调用形式不与其它函数混淆。

系统函数

标准C++函数:各种编译环境普遍支持,具有良好的移植性,建议优先使用。

头文件:如 cmath(或math.h)、 cstdlib(或stdlib.h)等

参考网站:http ://www.cppreference.com

非标准C++函数:当前操作系统或编译环境特有的,如:文件操作函数等。不同系统荐在差异,即是同一系统也有不同版本的不同。