初识C++(2)

什么是缺省参数

缺省参数:在调用函数中 可以不传参数
并且在半缺省的时候不能跳着传,只能连续传

缺省参数 不能跳跃传
半缺省(缺省值只能从右往左传,必须是连续给)
不能声明和定义不能同时出现缺省参数 
要给缺省参数 在声明给
缺省值必须是常量或者全局变量 
void Func(int a = 10, int b = 20, int c = 30)
{
    
    
	cout << "a= " << a << endl;	
	cout << "b= " << b << endl;
	cout << "c= " << c << endl << endl;
}

int main()
{
    
    
	//Func(1, , 3);	
	Func();
	Func(1);
	Func(1,2);
	Func(1,2,3);
	return 0;
}

什么是函数重载

函数重载:函数名形同 但是类型不相同,传的个数不同
c++会自动匹配函数

函数重载的时候,不传参数调用会有歧义

函数重载:函数名可以相同 但是类型不能相同(类型不同,个数不同)
cpp中 会自动匹配参数
int Add(int x, int y)
{
    
    
	return x + y;
}

double Add(double x, double y)
{
    
    
	return x * y;
}

//构成重载,不传参数的时候调用存在二义性(歧义)
void f()
{
    
    
	cout << "f()" << endl;
}

void f(int a = 0)
{
    
    
	cout << "f(int a)" << endl;
}

int main()
{
    
    
	Add(1, 2);
	//Add(2.2, 1.1);
	//Add(1, 2.2);

	f(0);
	f(20);
	return 0;
}

什么是引用

引用:给一个量区别名(一个变量可以有多个别名),符号&
引用后 引用的改变也会改变原来变量的值

void Swap(int& left, int& right)
{
    
    
	int a = left;
	left = right;
	right = a;
}

int main()
{
    
    
	// &: 引用(取别名/取外号) 一个变量可以取多个别名 地址也是一样的
	// 别名内容改变 会改变原本的内容
	int a = 1;
	int b = 2;
	int& c = a;
	Swap(a, b);
	cout << a << endl;
	cout << b << endl;
}

引用在函数中的作用

第一种:在函数变量里使用引用(在变量里用引用类似与指针)
传值的时候方便一些可以不用取地址符号直接传

void Swap(int& left, int& right)
{
    
    
	int a = left;
	left = right;
	right = a;
}

第二种引用函数中会吧返回的值 的别名赋值给main函数中接收的变量
用引用做返回值的优点:效率高
因为在函数中建立的变量出了函数会销毁那么,引用的缺点也很明显,返回的结果不确定,有可能是正常值,也有可能是随机值
但是如果在函数中使用了静态变量,他就不在栈上了,在静态区上,静态变量是需要初始化的,但是只会初始化一次,在函数中用静态变量来改变他会回到栈区

//出了作用域 返回对象就销毁了 ,不能用引用返回 ,否则结果不确定
//全局的 传引用返回 那么效率会很高 
//引用做返回值:可以修改返回对象
int& ADD(int x, int y)//有问题的代码
{
    
    
	//静态变量在 函数销毁后也在存在静态区的
	//始终的静态变量只会初始化一次
	static int c = x + y;
	//c = x + y;
	//如果静态变量后面被调用则从静态区变到 栈里面
	return c;
}

//void func1()
//{
    
    
//	int a = 0;
//	cout << &a << endl;
//}
//
//void func2()
//{
    
    
//	int c = 0;
//	cout << &c << endl;
//}

int main()
{
    
    
	//空间可以重复利用 所以 打印的地址是一样的
	//不同的函数名(参数类似) 也可以用同一块空间
	/*func1();
	func2();*/
	/*func();
	func();*/
	

	int& ret = ADD(1, 2);//ret为函数ADD的别名;
	//打印 3 or 随机值
	cout << ret << endl;
	ADD(3, 4);
	//打印 7 or 随机值
	cout << ret << endl;
	return 0;
}

常引用

如果一个数是常量 那么不能直接引用(权限放大) 要用常引用来引用。
常引用:const 修饰 引用
但是常引用可以引用 变量(缩小权限),变量改变 常引用的值也会改变,但是常引用不能改变自己的值
还有出现整形提升时,不能用引用直接改变,因为类型转换时会产生零时变量 零时变量不能给直接引用

int main()
{
    
    
	//如果 是常量 那么不能直接用引用来引用常量
	//如果是 常引用 那么可以引用 常量
	//权限不能放大
	const int a = 10;
	//int& b = a;
	const int& b = a;
	// 权限可以缩小
	int c = 20;
	const int& d = c;
	//常引用可以给常量区别名
	const int& e = 10;
	c = 30;
	cout << d<<endl;

	int i = 1;
	double j = i;
	//类型转换的时候会产生零时变量
	// 同类型的时候不会产生零时变量
	//零时变量是不可以给改变的 所有要 用 常引用
	const double& rj = i;
	cout << rj;

	return 0;
}

引用跟指针的区别

语法区别: 指针需要开辟空间, 引用不需要
总结: 引用的底层是用汇编实现的

int main()
{
    
    
	int a = 10;
	//语法区别: &不开额外空间, * 开额外空间 存地址
	//总结:引用底层是用 汇编实现的  
	int& b = a;
	int* ptr = &a;
	return 0;
}

c++中的宏替换

因为c++之父觉得 宏的细节要求太麻烦了,但又要有宏的优点,所有决定用 枚举和内联来替代宏,所以出现了内联函数。

内联函数:可以把函数替换成宏,不用建立函数栈帧,并且可以调试
内敛函数中:一般小于十行的才会展开,大于不展开
在多次调用中建议不使用内敛函数

扫描二维码关注公众号,回复: 17235634 查看本文章
inline 可以把函数变成宏 不用创造函数栈帧  并且可以调试
内联函数:函数小于十行,才会展开,小函数用 内联会提高效率
内敛函数不能使用在多次调用的函数里 每次调用都会调用内联函数,但是函数调用的是地址
 
inline int ADD(int x, int y)
{
    
    
	int c = x + y;
	return x + y;
}

猜你喜欢

转载自blog.csdn.net/dabai__a/article/details/134263084