系列文章目录
文章目录
前言
C++中的引用、函数的占位、重载等都给开发带来了便捷让我们更好地面向对象编程,那么这些区别于C语言的操作到底有什么用呢?让我们一起探讨一下
一、引用
1.引用的意义
- 节省内存空间:使用引用可以避免冗余的内存空间占用,特别是当传递大型对象时,使用引用可以避免拷贝构造函数的调用,从而提高程序的效率。
- 避免指针悬挂问题:指针悬挂是一种常见的错误,它是指一个指针在被释放之前已经被删除或者被移动了。使用引用可以避免这种情况的发生,因为引用只能被初始化一次,并且不能被修改。
- 改进代码可读性:使用引用可以使代码更加简洁、直观和易于阅读。对于函数的参数列表中存在多个输入和输出参数的情况,使用引用可以使代码更加清晰,减少歧义和误解。
- 实现数据共享:引用可以让多个变量引用同一个数据,这种方式可以实现数据共享,并降低程序出错的可能性。
2.引用的基本语法
数据类型 &别名 = 原名
int main()
{
int a = 10;
int &b = a;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
a = 10
b = 10
Tip:引用必须初始化并且初始化后不可以修改,不能出现下面的代码
int &c;//没有初始化
int a = 10;
int c = 20;
int &b = a;//一旦初始化就不能更改
b = c//这是赋值操作,不是更改引用
3.引用做函数参数
作用:函数传参时,可以用引用的技术让形参修饰实参
优点:可以简化指针修改实参
void Swap(int &a, int &b)//引用传递
{
int temp = a;
a = b;
b = temp;
}
int main()
{
int a = 10;
int b = 20;
Swap(a, b); // 交换a和b的值
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
a = 20
b = 10
4.引用做函数的返回值
Tip:不能返回局部变量的引用,原因是局部变量存储在栈区,而栈区的内存在函数结束后被释放了
int& func()
{
int a = 10; // 局部变量,存放在栈区,栈区的数据在函数执行后自动释放
return a;
}
int main()
{
int& ref = func();
cout << ref << endl; // 第一次可以打印正确的结果,因为编译器做了保留
cout << ref << endl; // 第二次打印结果不正确,因为编译器已经释放了该内存空间
return 0;
}
一旦运行就会出现下面的结果
10
2089003256
而把函数内的变量声明为存放在全局区的静态变量 就不会有这种问题了
int& func()
{
static int a = 10; // 静态变量,生命周期是整个程序运行过程中
return a;
}
int main()
{
int& ref = func();
cout << ref << endl;
cout << ref << endl;
return 0;
}
10
10
你甚至能这么用
int main()
{
int& ref = func();
cout << ref << endl;
cout << ref << endl;
func() = 1000;
cout << ref << endl;
cout << ref << endl;
return 0;
}
10
10
1000
1000
5.引用的本质
引用本质上是一个指针常量
常量不能改变,这也是引用不能被改变的原因
// 编译器会自动将引用转换为指针int const *p = &a;
void func(int& a)
{
a = 100;
}
int main()
{
int a = 10;
int &b = a;//编译器会自动将引用转换为指针int const *p = &a;
b = 20;//编译器会自动转换为*p = 20;
cout << a << endl;
func(a);
cout << a << endl;
return 0;
}
6.常量引用
作用:日常写代码过程中总会误操作把不能修改的函数变量修改了,常量引用主要用来修饰形参,防止误操作
void Value(const int &val)
{
cout << val << endl;
}
二、函数参数和函数重载
1.默认参数
void func(int a = 20, int b)
其中的a就是默认参数,传参时也不需要传两个值了,像下面调用就行了
func(10);
2.占位参数
void func(int a, int)
在这个函数中第二个int 后面没有形参,这并没有语法错误,调用的时候需要填补相应类型的任意参数,比如
func(10, 2)
3.函数重载
作用:函数名可以重复,提高复用性
条件:
- 同一个作用域下
- 函数名称相同
- 函数参数类型不同或者个数不同或者顺序不同
Tip:不能修改函数返回类型来进行函数重载
void func()
{
cout << "func()" << endl;
}
void func(int a)
{
cout << "func(int a)" << endl;
}
void func(double a, int b)
{
cout << "func(double a, int b)" << endl;
}
int main()
{
func();
func(10);
func(10.0, 20);
return 0;
}
func()
func(int a)
func(double a, int b)
当我传入不同参数时,编译器会调用不同的函数
总结
在这篇文章中我介绍了C++中引用和函数参数、重载的相关知识,希望对你有所帮助。