C++学习第十三天:引用(相当于指针常量),函数(默认形参,占位参数,重载)

一、引用

一)、基本概念

1、语法:数据类型+&+别名=原名

#include<iostream>
using namespace std;
#include<string> 

int  main()
{
	int a = 10;
	int& b = a;
	b = 20;
	cout << a;
}

2、作用:给变量取别名

3、注意事项:引用必须初始化,就是不能直接一句int &a;

引用不能同时对两段内存空间。就是一个变量可以有多个别名,但是这个别名不能同时是两个变量的别名;引用可以等量代换


	int a = 10;
	int& b = a;
	int& c = b;

二)、引用作函数参数

回顾:之前函数参数的传递方式有值传递(不能修饰实参)和地址传递(指针)(可以修饰实参)

引用由于就相当于指针常量,那么是不是就可以修饰实参呢?

#include<iostream>
using namespace std;
#include<string> 
void function(int & b)
{
	b = 100;
	cout << "b=" << 100 << endl;;
}

int  main()
{
	int a = 10;
	function(a);
	cout << "a=" << a;
}

实参a也会改变为100。因为b作为a的别名,那么对b重新赋值访问的是a的地址,a的内存空间,所以引用作函数参数会修饰实参。由于可以赋值,但是只能是一个变量的别名,那就相当于可以改变值,但不能改变指向地址,所以相当于指针常量。int * const p。

#include<iostream>
using namespace std;
#include<string> 
void swap(int &c ,int &d)
{
	int temp = c;
	c = d;
	d = temp;
}

int  main()
{
	int a = 10;
	int b = 20;
	swap(a,b);
	cout << a << endl;
	cout << b << endl;
}

三)不能返回局部变量的引用(类比指针,栈区的注意事项),函数的调用可以作为左值存在

1、因为也是通过地址去访问,但是局部变量已经被编译器立即释放了,所以第第一次保留输出,第二次无法输出。但是可以调用函数直接输出。

#include<iostream>
using namespace std;
#include<string> 
int & func()
{
	int a = 10;
	return a;
}

int  main()
{
	
	int& b = func();
	cout << b << endl;
	cout << b << endl;
}

第二次输出乱码。但是将局部变量改为在全局区的静态变量就正常输出

#include<iostream>
using namespace std;
#include<string> 
int & func()
{
	static int a = 10;
	return a;
}

int  main()
{
	
	int& b = func();
	cout << b << endl;
	cout << b << endl;

2、函数的调用作为左值

#include<iostream>
using namespace std;
#include<string> 
int & func()
{
	static int a = 10;
	return a;
}

int  main()
{
	
	int& b = func();
	cout << b << endl;
	cout << b << endl;
	func() = 1000;
	cout << b << endl;
	cout << b << endl;
}

第一次输出是输出a的引用,第二次函数作为a的左值相当于a=1000,那么输出b就相当于输出a。

引用的本质:相当于指针常量(可改值,不能改指向)。

四)、常量引用

1、作用:在函数的形参列表中,利用const修饰引用预防误操作。

相当于const既修饰变量又修饰地址:既不能改值,又不能改指向。

 由于b修改,实参a就会修改,但是在更大的程序中不希望a修改,所以会对形参做一个限制,不允许修改它的值。

二、函数

1、默认参数:在形参中提前写入默认参数,在不传入实参时,就默认用形参默认的值

但是默认参数右边参数必须都有默认,不能有有空缺。

函数声明和函数定义默认参数二选一。

函数调用时传入实参的值的优先级大于形参默认值。

2、占位参数:

函数调用时,占位参数必须填补

占位参数也可以有默认值 int=10,这时传递的时候就可以不用填补。

3、函数重载(不能出现二义性)

1)、满足条件:作用域相同,函数名相同,形参不同:类型不同,顺序不同,个数不同

目前阶段我的作用域是全局作用域。

2)、引用作为函数重载的条件

int &和const int &为不同的类型,但是调用时,实参数传入变量则调用参数为int &的函数,实参数传入数值则调用参数为const int &的函数。因为加了const 后参数只可读,不可写。并且int &a=10不合法。

3)、函数默认参数作为重载的条件:避免这种情况,重载时尽量避免默认参数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值