学习C++(2)缺省参数+引用

1.缺省参数

(1)缺省参数的概念

缺省参数(也叫默认参数)是声明或定义函数时为函数的参数指定的一个缺省值( 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须在函数声明给缺省值)。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。

#include<iostream>
using namespace std;

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

int main()
{
    func();//不传参,使用缺省值
    func(1);//传参,使用实参
    return 0;
}
(2)缺省参数的语法说明

缺省参数分为全缺省和半缺省参数。全缺省就是全部形参都给缺省值,半缺省就是部分形参给缺省值。

①C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。

void func1(int a, int b = 0, int c = 1)//从右往左依次给缺省值
{
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
	cout << "c=" << c << endl;
}
void func2(int a=0, int b, int c = 1)//这种写法是不允许的
{
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
	cout << "c=" << c << endl;
}

②带缺省参数的函数调用,C++规定必须从左到右依次给实参,不能间隔跳跃给实参。

void func1(int a = 0, int b = 0, int c = 0)
{
	cout << "a=" << a << ' ';
	cout << "b=" << b << ' ';
	cout << "c=" << c << ' '<<endl;
}
int main()
{
	func1();
	func1(1);
	func1(1, 2);
	func1(1, 2, 3);
	return 0;
}

在学习C++(1)中学习过函数重载的概念,当函数重载与缺省函数结合时,有以下的情况:

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

这两个函数虽然构成重载,但当调用f()时存在歧义

2.引用

(1)引用的概念

引用不是重新定义⼀个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间, 引用变量和它引用的变量共用同一块内存空间

int main()
{
	int a = 0;
	int& b = a;//给变量a取别名为b
	int& c = a;//可以取多个别名
	int& d = b;//可以给别名取别名
	++d;
	cout << &a << ' ' << a << endl;
	cout << &b << ' ' << b << endl;
	cout << &c << ' ' << c << endl;
	cout << &d << ' ' << d << endl;
}

(2)引用的语法说明

①引用在定义时必须初始化

②一个变量可以有多个引用

③引用一旦引用一个实体,再不能引用其他实体

int a=10;
int& b=a;
int& c=2;
b=c;//引用不能改变指向,这里是把c的值赋给a和b指向的内存空间

在链表中,由于引用不能改变指向,引用必须初始化,所以引用不能代替指针。

(3)引用的应用场景

引用在实践中主要是于引用传参和引用做返回值中减少拷贝提高效率和改变引用对象时同时改变被 引用对象

①引用传参

void swap(int& x, int& y)
{
	int tmp = 0;
	tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int a = 1, b = 2;
	swap(a, b);
	cout << a << ' ' << b;
}

②引用返回

int& func(int* arr1)
{
	return arr1[5];
}
int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	cout << (func(arr) += 1);
}

(4)const 引用

①必须用const引用引用一个const对象,const引用也可以引用普通对象,因为对象的访问权限在引用过程中可以缩小,但是不能放大。

const int a=1;
const int& ra=a;//用const引用引用const对象

int b=2;
const int& rb=b;//用const引用引用普通对象,b的访问权限不变,但rb的访问权限变小了

②由于C++规定临时对象具有常性,当引用临时对象时如果不使用const引用会造成权限放大。

int a=1;
const int& ra=a*3;//ra实际引用的是临时对象
double c=3.14;
const int& rc=c;//rc实际引用的是临时对象
(5)指针和引用的对比

①语法概念上引用是一个变量的取别名,不开空间,指针是存储一个变量地址,要开空间。

②引用在定义时必须初始化,指针建议初始化,但是语法上不是必须的。

③引用在初始化时引用⼀个对象后,就不能再引用其他对象;而指针可以不断地改变指向对象。

④引用可以直接访问指向对象,指针需要解引用才能访问指向对象。

⑤sizeof中含义不同:引用的结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4byte,64位下是8byte)。

⑥指针很容易出现空指针和野指针的问题,引用很少出现,引用使用起来相对更安全一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值