【开懂C++】new 引用 函数重载

news/2023/6/9 18:56:08

💽作者@:匿名者Unit
💽专栏:《C++:开懂》

文章目录

  • 一.new和delete运算符
    • 二.C++中的引用
      • 1.引用的概念
      • 2.引用的应用。
      • 3.引用的本质
      • 三.函数重载
        • 1.站位参数和默认参数
        • 2.函数的重载

一.new和delete运算符

new的使用方法和效果都与C语言的malloc相似,都是在内存堆区中申请内存,比如说我想申请10个类型为int大小的空间 如何编写呢:

int* p= new int(10);

与malloc不同的是在接收返回值时new不需要使用强制转换为自己想要的指针类型,编译器会根据你开辟空间的数据类型来返回那种类型的地址。
另一点与malloc不同的,new可以直接开辟数组,而malloc是间接开辟,不是那么直观,格式是怎样的呢:

int* arr= new int[10];

delete运算符
与malloc一样,new也有为释放堆区开辟空间的运算符----delete运算符,功能与free相似,书写上有所区别:

delete p;
delete[] arr;

二.C++中的引用

1.引用的概念

在C++中有如此规定,引用可以给变量的名字起一个别名

int a=10;
int &b=a;

这个的b就是a的一个别名,通过b可以自由的使用a。但是有两点
需要注意的 1.引用必须初始化,也就是说int &b;如此的引用定义是错误的,在使用引用时就必须初始化2.引用一旦初始化就不可以更改,就是说int a=10; int &b=a;b已经代表了a,不可以再代表其他变量。

2.引用的应用。

那引用有什么应用呢,我们在C语言函数部分学习过,想函数传参有传值传址两种方式,在经典例子交换两数值的函数中,我们得知传值时,形参只是实参的一份临时拷贝,即使交换了形参的值,也不会改变实参。而传址调用将会使得形参可以通过实参的地址修改实参的数值。
其实在函数传参时,我们还可以使用引用的方式来传参:

void my_swap(int &x, int &y)
{int tmp = x;x = y;y = tmp;
}int main()
{int a = 12;int b = 32;my_swap(a, b);cout << " a= " << a << endl;cout << " b= " << b << endl;return 0;
}

如上使用引用的方式接受实参,同样可以交换实参的值。
讨论完形参使用引用后,我们再来说一下当函数返回类型为引用时,有哪些注意事项把:
1.不能返回局部变量的引用

int& test()
{int a=10;return a;//不能返回局部变量的引用
}
int main()
{int &ret-test();return 0;
}

上图的操作其实是说不通的,变量a在函数test结束后就会自动销毁,所以ret找到的地址也就是非法的一块地址了,是不是感觉引用和指针非常想呢
2.当返回引用时函数可以作为左值

int& test2()
{static int a = 10;//static静态变量return a;
}
int main()
{int& ret = test2();test2() = 20;//当返回引用时函数可以作为左值cout << " ret =" << ret << endl;
}

3.引用的本质

通过上面的介绍,我们是时候揭开引用的神秘面纱了,其实在C++内部,引用本质就是一个指针常量。可见C语言的底层性。
指针常量

int *const p;

也就是一个指针可以通过指向的地址修改内容,但是不可以指向其他的地址
例如我们之前写的代码int a=10; int &b=a; 实质上也等于这个代码int a=10;int *const b =&a;就是这个样子的。
我们再讲解一个例子来理解引用:

int main()
{int &a=10;const int &a=10;
}

上图代码中int &a=10; 其实是错误的,因为他本质是int *const a=10;显然是将10当做了地址指针常量a指向了地址10.这就造成了非法访问。
const int &a=10; 这样书写则是可以的,因为编译会帮你将代码改为int tmp=10; const int &a =tmp;

三.函数重载

1.站位参数和默认参数

默认参数
在函数的参数中可以只有数据类型和变量名也可以为形参赋上初始值,也就是所谓的默认参数

int func(int a, int b=20, int c=30)
{return a + b + c;
}
int main()
{int ret=func(10, 20, 30);return 0;
}

而对于默认参数有几点注意事项需要注意1. 函数的默认参数,如果我们向形参传入数据则使用我们传入的数据,否则使用默认参数
2.形参中如果一个参数有了默认参数,在他右边的参数也必须有默认参数
3.函数的声明和实现不可以同时有默认参数
站位参数
站位参数的概念比较简单,就是在函数的参数列表中只写上数据类型,没有变量名,例如:

int func(int a, int)
{;
}

如上func就有一个占位参数

2.函数的重载

首先了解重载的条件:1.在同一作用域下2.函数名称相同3.函数参数类型不同,或者个数不同,或者顺序不同。例如:

void func(int a)
{cout << "(int a)的调用" << endl;
}
void func(double a)
{cout << "(double a)的调用" << endl;
}
void func(int a,double b)
{cout << "(int a,double b)的调用" << endl;
}
void func(double a, int b)
{cout << "(double a, int b)的调用" << endl;
}int main()
{func(3.14,5);func(2);func(3.14);func(5,3.14);return 0;
}

我们就可以通过函数的重载,在主函数中向函数传入不同的参数,来使用不同的函数
注意事项:当函数重载遇上默认参数时可能会出错:

void func(int a, int b = 10)
{cout << "(int a)的调用" << endl;
}
void func(int a)
{cout << "(int a)的调用" << endl;
}
int main()
{func(10);return 0;
}

像这样的代码,对函数重载的调用就会出错

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4570938.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

《动手学深度学习》课后习题1

《动手学》&#xff1a;线性回归 **1.**假如你正在实现一个全连接层&#xff0c;全连接层的输入形状是78&#xff0c;输出形状是7 1&#xff0c;其中7是批量大小&#xff0c;则权重参数w和偏置参数b的形状分别是____和____ 答案&#xff1a;81,11 2. 课程中的损失函数定义为&a…

李航 统计学习方法 第一章 课后 习题 答案

####1.1 统计学习方法的三要素是模型、策略、算法。 伯努利模型是定义在取值为0与1的随机变量上的概率分布。 统计学分为两派&#xff1a;经典统计学派和贝叶斯统计学派。两者的不同主要是&#xff0c;经典统计学派认为模型已定&#xff0c;参数未知&#xff0c;参数是固定的…

SAP FI月结 坏账转移及计提准备 Doubtful Receivables Bad Debts

SAP FI月结 坏账转移及计提准备 Doubtful Receivables & Bad Debts - 知乎大的企业一般会有收不回来的坏账&#xff0c;需要做坏账计提准备&#xff0c;这也是SAP月结的步骤之一。 假设我们卖给客户一批货物&#xff0c;对该客户会产生一笔应收账款&#xff0c;但客户一直没…

AR-关于应收账款坏账处理

在oracle系统中&#xff0c;计提坏账是在总账中计提&#xff0c;实际发生坏账处理时&#xff0c;是在应收模块的事物处理中进行的。&#xff08;1&#xff09;在应收款活动中&#xff0c;新建坏账处理类型。&#xff08;2&#xff09;查找到需要进行坏账处理的发票。单击&#…

Python中的for循环,while循环

一、for循环 用法1&#xff1a; for 变量 in range(10):   循环需要执行的代码 实验一&#xff1a;计算123…100 在C语言或者java中代码如下&#xff1a; sum 0 for(int i1;i<100,i): sum sum i print sum 在python中代码如下&#xff1a; range相关知识点&#xff1a…

三七互娱的荣与忧:手游业务大增、页游下滑,计提坏账准备3000万元

8月30日&#xff0c;三七互娱&#xff08;SZ:002555&#xff09;发布2020年上半年度业绩报告。财报显示&#xff0c;2020年上半年&#xff0c;三七互娱营收79.89亿元&#xff0c;同比增长31.59%&#xff1b;归属于上市公司股东的净利润约17亿元&#xff0c;同比增长64.53%。 据…

想兼职写作,要准备些什么?

我是一名地道的打工人&#xff0c;一直想靠在职场打怪升职加薪。但是&#xff0c;社畜几年来&#xff0c;唯一加工资的时候还是自己跳槽向新公司的Hr多要了点&#xff0c;几乎没有任何一家公司主动给我加薪。因为意外&#xff0c;被一群写稿爱好者带动&#xff0c;走进了互联网…

赚钱项目在家可以赚钱,赶紧来看看吧!

互联网发展到现在&#xff0c;已经可以足不出户&#xff0c;来获取世界各地的信息。但是互联网为人们带来的&#xff0c;不仅仅是信息的便利&#xff0c;同时也给很多人&#xff0c;提供了在家赚钱的机会。今天小编就来盘点几个&#xff0c;适合一个人在家赚钱的项目。 一、经营…