C++:引用以及函数的占位、重载

系列文章目录

C++内存存储模型

C++引用以及函数的占位、重载

C++封装与对象特性

C++对象特性及友元 

C++运算符重载及继承

C++多态

C++文件操作

C++模板


前言

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++中引用和函数参数、重载的相关知识,希望对你有所帮助。

  • 23
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值