c++知识点总结---函数

156 阅读4分钟

函数

函数原型 : 返回值类型 函数名(参数类型);
函数格式 : type functionname(argumentlist) { statements}
先声明函数原型,在主函数之后定义函数;且不让在函数内定义函数
函数默认参数:—对于有参数列表的函数,函数原型必须从右往左添加默认值 ,如果自己传入数据,就使用自己的数据。(函数定义时可以不写默认参数)
如果函数声明有了默认参数,那么函数实现就不能再有默认参数。
函数完成后,它所占用的存储空间也会随着被释放掉。
函数的占位参数,即函数的输入只有数据类型,如,void funcname(int a , int)
函数的占位参数也可以有默认值 void function(int a, int = 10);

函数传参有三种形式:
按值传递:不能改变原始数据;传递的是原始数据的副本;
按地址传递:可以改变原始数据,但可以加const关键字,防止修改;传递的参数是地址值
按引用传递:可以改变原始数据,只需要在函数定义时,形参上加&,调用时和按值传递一样;可以加const关键字,防止修改;

//example
//值传递
void func1(int a,int b){
	a = a + b;
	b = a - b;
	a = a - b;
}
//地址传递
void func2(int *a, int *b){
	*a = *a + *b;
	*b = *a - *b;
	*a = *a - *b;
	
}
//引用传递
void func3(int &a,int &b){
	a = a + b;
	b = a - b;
	a = a - b;
}

//main中调用
int max = 10;
int min = 3;
func1(min, max); 
cout<<"min = " << min <<"  ";
cout<<"max = " << max <<endl;
func2(&min, &max); 
cout<<"min = " << min <<"  ";
cout<<"max = " << max <<endl;
func3(min, max); 
cout<<"min = " << min <<"  ";
cout<<"max = " << max <<endl;

::: warning
返回局部对象的引用是错误的;返回局部对象的指针也是错误的,但可以返回new出来的对象。

int & func(){
	int tem = 0;
	return tem;//报错 返回指针同理
	

}

:::函数重载
重载函数:同一作用域内的几个函数名字相同但形参列表不同,我们称之为重载函数。(overloaded)。—不严谨的定义哦
不允许2个函数除了返回类型外其他所有的要素都相同。

引用作为函数重载的条件:

void func(int &a){};
void func(const int &a){};
int a=10; 
func(a); //调用第一个函数;
func(10);//调用第二个函数;因为&a=10是不合法的,const int &a = 10;

函数重载遇到默认参数:

void func2(int a){}
void func2(int a,int b=10){}
func2(10); //会报错。二义性,尽量避免这种错误

数组名arr 是数组首地址 &arr[0];

//arr[i] == *(ar + i);
//&arr[i] == ar +i;
int arr[]  =  {1,2,3,4};
int *ar = arr;
int *const a = arr;
cout << arr[3] << endl;//4
arr[2] = 9;
cout << arr[2] << endl;//9
cout <<*(arr+2) << endl;//9
cout << *(arr+3) << endl;//4
cout << *(ar+3) << endl;//4
ar++;
cout << *(ar) <<endl;//2
*a = 10;
cout << arr[0] << endl;//10

//a++; //报错
//函数名是指针常量,不可修改指向的地址,但可修改指向地址中的内容;

函数可被声明多次,但只能被定义一次

二维数组: int data[3][4] = {{1,1,1,1},{2,2,2,2},{3,3,3,3}};

arr[r][c] == *(*(arr + r) +c)

二维数组做函数参数时: void funcname(arr[][1], int size) {...;} //指定列数,不指定行数

int add(int arr[][3],int size)
{
	int total = 0;
	for(int i = 0; i < size; i++)
	{
		total += arr[i][0];
		total += arr[i][1];
		total += arr[i][2];
	}
	return total;
}
//main()调用
int array[3][3] = {{1,1,1},{2,2,2},{3,3,3}};
int total = add(array,3); // 18

函数指针:函数名就是函数地址 注意区分:funtionname ----地址 和functionname() ----函数返回值

使用函数指针调用函数:

//example
double pam(int); 
double (*pf)(int);
pf = pam; //可以使用pam()和(*pf)()来调用。

内联函数:在函数声明和定义前都加上关键字inline 但通常在提供原型的地方将整个定义给出,inline是一个用于实现的关键字而不是一个用于声明的关键字。对于类方法,定义在类体内部的方法自动成为内联方法。内联函数和普通函数的区别在于,内联函数调用时,相当于把这部分代码替换到调用的位置。一般适用于短小的代码实现。
在函数声明前加inline;
在函数定义前加inline;
通常省略声明,直接定义;

内联与宏


#define square(X) X*X;
int main() {
	int a = 10;
	auto a1= square(5);//5*5=25
	auto a2 = square(3 + 4);//3+4*3+4=19
	auto a3 = square(a++);//a++*a++=100,a=12;
	auto a4 = square(++a);//++a*++a = 196,a = 14
	return 0;
	//重点在于:宏定义是直接替换相应变量。如++a直接替换X;
}