**作用: **给变量起别名
语法: 数据类型 &别名 = 原名
示例:
int main() {
int a = 10;
int &b = a;//b为a的别名
cout << "a = " << a << endl;//10
cout << "b = " << b << endl;//10
b = 100;
cout << "a = " << a << endl;//100
cout << "b = " << b << endl;//100
system("pause");
return 0;
}
示例:
int main() {
int a = 10;
int b = 20;
//int &c; //错误,引用必须初始化
int &c = a; //一旦初始化后,就不可以更改
c = b; //这是赋值操作,不是更改引用
cout << "a = " << a << endl;//20
cout << "b = " << b << endl;//20
cout << "c = " << c << endl;//20
system("pause");
return 0;
}
**作用:**函数传参时,可以利用引用的技术让形参修饰实参(与指针传参类似);
**优点:**可以简化指针修改实参;
示例:
//1. 值传递
void Swap01(int a, int b) {
int temp = a;
a = b;
b = temp;
}
//2. 地址传递
void Swap02(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
//3. 引用传递
void Swap03(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int a = 10;
int b = 20;
Swap01(a, b);
cout << "a:" << a << " b:" << b << endl;//a:10 b:20
Swap02(&a, &b);
cout << "a:" << a << " b:" << b << endl;//a:20 b:10
Swap03(a, b);
cout << "a:" << a << " b:" << b << endl;//a:20 b:10
system("pause");
return 0;
}
总结:通过引用参数产生的效果同按地址传递是一样的。引用的语法更清楚简单
作用:引用是可以作为函数的返回值存在的;
注意:不要返回局部变量引用;
用法:函数调用作为左值。
示例:
//返回静态变量引用
int& test02() {
static int a = 20;
return a;
}
int main() {
//如果函数做左值,那么必须返回引用
int& ref2 = test02();
cout << "ref2 = " << ref2 << endl;//20
test02() = 1000;//函数做左值
cout << "ref2 = " << ref2 << endl;//1000
system("pause");
return 0;
}
本质:引用的本质在c++内部实现是一个指针常量.
示例:
//发现是引用,转换为 int* const ref = &a;
void func(int& ref){
ref = 100; // ref是引用,转换为*ref = 100
}
int main(){
int a = 10;
//自动转换为 int* const ref = &a; 指针常量是指针指向不可改,也说明为什么引用不可更改
int& ref = a;
ref = 20; //内部发现ref是引用,自动帮我们转换为: *ref = 20;
cout << "a:" << a << endl;//20
cout << "ref:" << ref << endl;//20
func(a);
cout << "a:" << a << endl;//100
return 0;
}
结论:C++推荐用引用技术,因为语法方便,引用本质是指针常量,但是所有的指针操作编译器都帮我们做了。
**作用:**常量引用主要用来修饰形参,防止误操作;
在函数形参列表中,可以加const修饰形参,防止形参改变实参。
示例:
//引用使用的场景,通常用来修饰形参
void showValue(const int& v) {
//v的值无法改变
cout << v << endl;//100
}
int main() {
//int& ref = 10; 引用本身需要一个合法的内存空间,因此这行错误
//加入const就可以了,编译器优化代码,int temp = 10; const int& ref = temp;
const int& ref = 10;
//加入const后不可以修改变量
cout << ref << endl;//10
//函数中利用常量引用防止误操作修改实参
int a = 100;
showValue(a);
system("pause");
return 0;
}
在C++中,函数的形参列表中的形参是可以有默认值的。
语法: 返回值类型 函数名 (参数= 默认值){}
示例:
int func(int a, int b = 10, int c = 10) //b,c的值默认为10
{
return a + b + c;
}
//1. 如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须都要有默认值**
//2. 如果函数声明有默认值,函数实现的时候就不能有默认参数
//用于函数声明和实现分离的场景
int func2(int a = 10, int b = 10);//函数声明
//函数实现
int func2(int a, int b) {
return a + b;
}
int main() {
cout << "ret = " << func(20, 20) << endl;//20+20+10=50
cout << "ret = " << func(100) << endl;//有默认值的形参可以不传其实参
//100+10+10=120
system("pause");
return 0;
}
从这个位置往后,从左向右,必须都要有默认值
;C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置;
语法: 返回值类型 函数名 (数据类型){}
示例:
//函数占位参数 ,占位参数也可以有默认参数
void func(int a, int)
//void func(int a, int=10)
{
cout << "Hello world!" << endl;
}
int main() {
func(10,10); //占位参数必须填补
// func(10); //与默认参数时可以省略
system("pause");
return 0;
}
作用: 函数名可以相同,提高复用性;
函数重载满足条件:
注意: 函数的返回值不可以作为函数重载的条件。
示例:
//函数重载需要函数都在同一个作用域下
void func()
{
cout << "func 的调用!" << endl;
}
void func(int a)
{
cout << "func (int a) 的调用!" << endl;
}
void func(double a)
{
cout << "func (double a)的调用!" << endl;
}
void func(int a ,double b)
{
cout << "func (int a ,double b) 的调用!" << endl;
}
void func(double a ,int b)
{
cout << "func (double a ,int b)的调用!" << endl;
}
int main() {
func();
func(10);
func(3.14);
func(10,3.14);
func(3.14 , 10);
system("pause");
return 0;
}
示例:
//函数重载注意事项
//1、引用作为重载条件
void func(int &a)
{
cout << "func (int &a) 调用 " << endl;
}
void func(const int &a)
{
cout << "func (const int &a) 调用 " << endl;
}
//2、函数重载碰到函数默认参数
void func2(int a, int b = 10)
{
cout << "func2(int a, int b = 10) 调用" << endl;
}
void func2(int a)
{
cout << "func2(int a) 调用" << endl;
}
int main() {
int a = 10;
func(a); //调用无const(传变量)
func(10);//调用有const(传常量)
//func2(10); //碰到默认参数产生歧义,需要避免
func2(10,20); //调用func2(int a, int b = 10)
system("pause");
return 0;
}