VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 3518|回复: 88

《实用C++》第27课 引用及new和delete的使用

  [复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-3-6 01:15:14 | 显示全部楼层 |阅读模式
《实用C++》第27课 引用及new和delete的使用《实用C++》第27课 引用及new和delete的使用

1、何为变量的引用?
通过之前对指针的讲解,相信大家对于指针来说都比较熟悉了,指针里面存的是某个变量的地址。那么这节课给大家讲解一下变量的引用,跟指针有点像。他是C++对于C语言的一个重要的扩充。C语言中没有引用,C++有引用,而且C++中更建议大家多用引用少用指针。

变量的引用就是一个变量的别名,变量和变量的引用代表着同一个变量。例如:
int a = 5; //语句1
int& b = a; //语句2
int* p = &a; //语句3
这里面a是一个普通的int类型变量,b呢,就是变量a的一个引用,p呢就是指向变量a地址的一个指针变量。
其中语句2中的 & 符号是引用的声明符号,不是取地址哦,语句3中的 & 符号确实是取地址符。
如何来区分呢?大家记住:紧跟在数据类型后面的&符号就是引用的声明符号,其他情况都可以认为是取地址符号。

2、引用的注意事项:
①、引用不是一种独立的数据类型,引用只有声明,没有定义。必须先定义一个变量,之后对该变量建立一个引用。也就是说有变量才有变量的引用,不可能先声明一个引用而不去引用任何变量,这点跟指针不同,指针可以先声明,之后的任意时刻指向某个变量的地址,引用就不是;
例如:int &b; //先声明定义一个引用是错误的
②、声明一个引用时,必须同时对其初始化,即声明该引用代表哪一个变量。这个跟第①点要表达的意思一样。有一种例外的情况,当一个函数的参数是某个变量的引用时,形参不必在声明中初始化,他的初始化是在函数调用时的虚实结合实现的,即作为形参的引用是实参的别名;
void swap(int& a, int& b);

③、声明一个引用后,不能再让其作为另一个变量的引用了。例如:
int a1 = 2, a2 = 5;
int& b = a1; //正确
int& b = a2; //错误

④、不能建立引用数组,例如:
int a[5] = {0};
int& b[5] = a; //错误
int& c = a[0]; //正确(C++新标准支持)

⑤、可以建立引用的引用(C++新标准支持),也可以建立引用的指针,例如:
int a = 3;
int& b = a; //正确
int& c = b; //正确
int* p = &b; //正确,得到的是变量a的地址
*p = 5;
c = 6;

3、引用和指针的联系:
关于引用的性质,如果在程序中声明了b是变量a的引用,实际上在内存中为b开辟了一个指针型的存储单元,在其中存放变量a的地址,输出引用b时,就输出b所指向的变量a的值,相当于输出*b。引用其实就是一个指针常量,他的指向不能改变,只能指向一个指定的变量。所以,引用的本质还是指针,所有引用的功能都可以由指针实现。C++之所以增加引用的机制,是为了方便用户,用户可以不必具体去处理地址,而把引用作为变量的“别名”来理解和使用,而把地址的细节隐藏起来,这样难度会小一些。

4、引用的具体使用:
不用指针,用引用的方式实现 swap 函数,功能是交换两个整形变量的值,实现如下:
void swap(int& a, int& b)
{
        int t = a;
        a = b;
        b = a;
}
简单吧,跟指针能达到一样的效果。

5、使用new和delete动态分配内存:
在以后的开发过程中,因为局部变量的局限性,只能在其作用域内使用。因此,我们需要动态的分配和撤销内存空间,使其可以在任何函数中使用。例如:
char* get_same_string(char* p1, char* p2)
{
    //
}
get_same_string 函数的作用是从参数p1和p2中找出相同的部分,例如,p1的内容是:"aabbcc",p2的内容是:"kkbcyy",他们相同的子串就是 "bc" 对吧?我想把这个结果通过函数的返回值给传出去。所以函数的返回值是一个 char* 类型,如果在函数中定义一个局部变量 szret[100] 数组,用这个数组来存储相同部分的子串 "bc",那么就不能返回,为什么呢?因为 szret 是局部变量,作用域只是在函数的内部,超过函数的作用域之后 szret 的内存就可能被释放了。所以用它来返回之后,在函数的外部再去使用是非常不安全的,也是错误的。所以这种情况就可以使用 new 动态分配内存来解决。

6、new 出来的变量/内存的生命周期:
C++ 中的 new操作符 和C语言中的 malloc 函数类似,如果你不主动 delete 掉这段申请的内存的话,它会一直存在,直到进程结束后系统会回收掉这段资源;而如果你delete掉这段申请的内存,则这段申请到的内存的生命周期为从你new(申请一段内存)到你delete(释放掉这段内存)这段时间。

7、new 和 delete 的使用:
C语言中是使用 malloc 和 free 两个函数来进行动态内存的申请和释放的,C++用引入了更为智能的 new 和 delete 操作符来进行内存的申请和释放,举例:
int* p = (int*)malloc(sizeof(int)); //C语言中使用 malloc 来申请一个int类型变量的内存
*p = 5;
free(p);

int* p = new int(5); //C++ 中使用 new 来申请一个int类型变量的内存
//怎么样,看出 new 的优势了吧!
delete p; //删除变量

int* p = new int[5]; //使用new申请一个包含5个int元素的数组
delete [] p; //删除数组

还有一个更重要的new优于malloc的地方,在以后的课程中会给大家讲解C++中的类class,用new申请一个类对象的时候,对象申请成功之后会默认调用其构造函数,而C语言中的malloc只是会申请空间,但是不会调用对象的构造函数。这个会在以后的课程中给大家讲解。所以,在C++中大家就放弃 malloc 和 free 吧,直接用 new 和 delete 来操作动态内存。

8、小作业:
完成 get_same_string 函数的功能!

第27课免费试看,下载地址回复后可见:
游客,如果您要查看本帖隐藏内容请回复

#######################################################
获得所有教学视频、课件、源代码以及售后答疑详见:
《实用C++》:http://www.cctry.com/thread-275996-1-1.html
VC驿站官方客服QQ:8260671

#######################################################
《实用C++》第27课 引用及new和delete的使用《实用C++》第27课 引用及new和delete的使用




上一篇:《实用C++》第26课 枚举类型及定义新的类型名字
下一篇:我的电脑应该装什么版本的VC++编译器?

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

98_avatar_middle
在线会员 tomok 发表于 2018-3-7 14:18:16 | 显示全部楼层
好好学习

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

51_avatar_middle
online_vip zxnnnnn 发表于 2018-3-10 12:35:41 | 显示全部楼层
支持老大的原创教学,简单易懂,言简意赅。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

17_avatar_middle
在线会员 chenhu 发表于 2018-3-11 11:53:33 | 显示全部楼层
好好学习

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

08_avatar_middle
在线会员 guanghua1982 发表于 2018-3-11 12:59:43 | 显示全部楼层
支持老大的原创教学!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

78_avatar_middle
在线会员 csa 发表于 2018-3-12 13:04:02 | 显示全部楼层
强大,又出新课。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

74_avatar_middle
online_vip08 wssfcn 发表于 2018-3-13 10:27:09 | 显示全部楼层
看看         

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

18_avatar_middle
在线会员 Sylm 发表于 2018-3-13 15:30:33 | 显示全部楼层

支持老大的原创教学!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

22_avatar_middle
online_vip jesy 发表于 2018-3-13 20:48:55 | 显示全部楼层
继续学习.....

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

13_avatar_middle
在线会员 冬季恋歌 发表于 2018-3-13 20:51:16 | 显示全部楼层
开辟内存空间跟删除空间的看看这教程

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

18_avatar_middle
online_vip 听雨声等你笑 发表于 2018-3-13 22:22:45 | 显示全部楼层
学习学习

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

80_avatar_middle
在线会员 zp521 发表于 2018-3-13 22:47:22 | 显示全部楼层
坚持学习!!!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

69_avatar_middle
在线会员 awfymwvf 发表于 2018-3-15 11:03:03 | 显示全部楼层
谢谢管理,下载看看。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

80_avatar_middle
在线会员 wangki216 发表于 2018-3-16 23:52:28 | 显示全部楼层
回复拿走了              

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

94_avatar_middle
online_vip08 Mtong 发表于 2018-3-17 17:59:46 | 显示全部楼层
谢谢老师!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

13_avatar_middle
online_vip 明天你好123 发表于 2018-3-17 18:52:20 | 显示全部楼层
hello world

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

10_avatar_middle
online_vip08 小菜一碟 发表于 2018-3-19 08:19:51 | 显示全部楼层
继续吧,反复学习中

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

69_avatar_middle
在线会员 hbjdt 发表于 2018-3-21 18:29:31 | 显示全部楼层
谢谢版主,辛苦了

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

15_avatar_middle
在线会员 矿泉水 发表于 2018-3-21 23:17:07 | 显示全部楼层
支持支持支持

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

22_avatar_middle
在线会员 supersct 发表于 2018-3-22 19:59:12 | 显示全部楼层
谢谢版主,辛苦了

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-10-22 14:50

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表