#include <cstdio>
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
//void myswap(int a, int b)
//{
//	int temp = a;
//	a = b;
//	b = temp;
//}//值传递,另外开辟一块栈区,将值拷贝到新的栈区里,在新的栈区里进行交换,完成后进行释放,原来的值没有任何变化。
//void myswap(int *a, int *b)
//{
//	int temp = *a;
//	*a = *b;
//	*b = temp;
//
//}//址传递,
void myswap(int &a, int &b)
{
	int temp = a;
	a = b;
	b = temp;

}//引用传递,
//引用
/*********************************************************
Type &name ;        <--->    Type * const name;
void f(int &a)      <--->    void f(int * const a)
{                            {
	a=5;            <--->        *a=5;
}                             }
引用在C++中的内部实现是一个常量指针;
1.C++编译器在编译过程中使用常量指针作为引用的内部实现,
因此引用所占用的空间大小与指针相同。
2.从使用的角度,引用只是一个别名,C++为了实用性而隐藏了
引用的存储空间这一细节。

////////////////////////////////////////////////////////////
!!!指针和引用的使用情况选择
如果必须用到数据的首地址的话就采用指针(*)
如果只用到数据本身的数据的话就用引用(&)
ps:引用不占内存,可以优化程序;
///////////////////////////////////////////////////////////
**********************************************************/

//函数
/**********************************************************
内联函数(inline)
@通过代码的内存膨胀来减少函数跳转的次数,以此来减少时间的花费。
@函数前面加上关键字inline

inline int add(int a,int b)
{
	return a+b;
}
使用条件:
函数体积极少,使用频率高。(内存膨胀的代价小于函数跳转的时间花费)
**********************************************************/

//函数的重载
/*********************************************************
构成重载:
@!函数名一致;
@!参数列表不一致,
@!!参数的对应位置的类型不同;
@!!参数的个数不同;

ps:

void a(int a,char b)   void a(char a,int b)    void a(int a)
{                      {                       {

}                      }                        }

-----------------------------
!!!注意:
	和函数的返回值没有关系
int a(int a) 

char a(int a)
报错!!!
-----------------------------


**********************************************************/
int chongzai(int a)
{
	a++;
	return a++;
}
double chongzai(double a)
{
	return a+1;
}
float myadd(float a, float b)
{
	return a + b;
}
int myadd(int a, int b)
{
	return a + b;
}
//************************************************

//函数的缺省
/*********************************************************
@!函数在定义形参时给出初始值
!!!
@参数的缺省只能由后往前,依次缺省,不能从前往后缺省
@参数的缺省,在只有定义的情况下可以写在定义上,如果有声明,只要在声明中缺省,不要在定义中写缺省;
@参数的缺省与重载混合使用,注意因为缺省导致的二义性
!!!
*********************************************************/
int op(int a, int b, int c=9)
{
	return a + b + c;
}
int op(int a, int b)
{
	return a + b;
}
int main()
{
	//op(1, 2);二义性,缺省后重载有二义性;
	op(1, 2, 3);



	//*:解引用,乘号,指针
	//&:位与,取地址,引用
	//int a = 10;
	//int *p = &a;
	//*p;
	/*int &id = a;
	id = 100;*/
	
	//cout << a << endl;
	//printf("a=%lf\n", chongzai(2.3));
	//printf("a=%d\n", myadd(2,3));
	//printf("a=%f\n", myadd((int)2.3,(int)3.3));
	//printf("a=%f", myadd(2.3,3.3));        !!!!!!注意类型转换导致的错误
	getchar();
}