仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3128|回复: 8
打印 上一主题 下一主题

[C++基础] 来一发为何利用指针比利用工具自己更好?

[复制链接]
简单生活 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 11:05:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
看不懂man文档的人.在linux中,命令可分为系统基本命令和应用程序命令.系统基本命令是所有的unix类系统都支持的命令,走到哪都不变,只要是unix类系统上就肯定有.
 成绩:为何利用指针比利用工具自己更好?

  我是一位Java程序员,比来入手下手进修利用C++中的工具。有个成绩我一向以为很狐疑:那就是为何人们更喜好利用指向工具的指针而不是工具自己。好比:
  如许声明:Object*myObject=newObject;
  而不是:ObjectmyObject;
  利用函数的时分也是云云,假定有个函数为testFunc(),利用时能够如许:
  myObject.testFunc();
  但一样平常如许挪用:
  myObject->testFunc();
  可是我不晓得为何要如许做,我想多是由于我们间接会见了内存地点,以是能进步效力和运转速率。我了解的对吗?
 最好谜底:

  很不幸,你看的良多讲的都是静态分派。这只能申明存在良多基本不精晓C++的程序员。从某种意义上说,你的成绩实在能够分红两个小成绩。第一个是应当什么时候利用静态分派(即便用new关头字)?第二个成绩是应当什么时候利用指针?
  利用符合的工具一般是做好一项事情的关头。在年夜部分情形下,存在比利用一样平常的静态分派大概原指针更符合、更平安的办法。
  静态分派

  在你的成绩里,你用了两种体例创立工具。这两种体例次要的分歧在于工具的存储工夫。当实行ObjectmyObject;这句代码时,它作为主动变量被创立,这意味着当工具出了感化域时也会主动烧毁。而当你利用newObject()这类体例时,工具所具有的内存是静态分派的,这暗示直到你挪用delete()办法工具才会被烧毁,不然一向存在。当必要用静态分派内存来处置时,你应当只利用静态分派的体例,也就是说,当你可使用静态分派内存的时分就不要利用主动变量。
  以下是大概会利用到静态分派的两种罕见情形:
  1.当想让工具在出了感化域后仍然存在——且的确就是之前存储在该内存中的工具,而不是工具的拷贝。假如你能够承受利用工具的拷贝大概挪动(年夜部分情形下你应当如许),那末你更应当利用主动存储体例。
  2.当必要大批内存时,这类情形下极易招致栈溢出。固然假如这对你来讲基本不是成绩就更好了(年夜部分情形下这是不成能的)。这明显超越了C++的统领局限,可是不幸的是,我们必需处置我们开辟的体系中存在的这类实际成绩。
  当你的确必要利用静态分派时,你应当将它封装到一个智能指针中大概其他能具有RAII特征的范例(比方尺度容器)。智能指针供应静态分派内存的工具的一切权语义。比方std::unique_ptr和std::shared_ptr。假如你可以符合的利用它,你基础上不必要本人办理内存(拜见RuleofZero这篇文章)。
  指针

  现实上,指针除用来完成静态分派内存外另有良多别的的用法,可是个中年夜部分也都存在比它们更好的选择。就像后面说过的那样,除非你必需用到指针,不然不要冒然利用。
  必要利用援用的情形:有的时分,你想挪用的函数必要会见你以后的工具自己(而不是它的拷贝),那末你就必要利用指针作为参数举行传送(暂不管它是怎样分派的)。但是,在年夜部分情形下,利用援用会比指针更好,这也恰是援用被计划的来由。注重一下,这里不必要像下面所说的那样往延伸工具的性命周期。后面已说过了,假如你能承受利用工具的拷贝,那末你就没需要再利用援用了。
  必要利用多态的情形:一般你只能经由过程工具的指针大概援用来完成多态(也就是依据工具的静态范例来挪用函数)。假如这就是你想要的,那末你就必要利用指针大概援用。一样,以指针为优先选择。
  当工具可疏忽时,经由过程传送一个空指针来完成工具是可选的属性:假如它是一个参数的话,你应当优先利用默许参数大概函数重载的办法。不然你应当选择一种能够封装这类举动的范例,比方boost::optional(大概是std::optional)。
  当你想下降文件间的编译依存干系从而节俭工夫:指针的一年夜特性在于你只必要在后面声明一下指针指向的范例(而假如要利用实践的工具,你还必要界说一下)。如许你就可以下降你的编译单位之间的耦合性从而削减编译工夫。参考Pimplidiom.
  当你想挪用C大概相似C作风的函数库的接口时:在这类情形下,你不能不利用指针举行操纵。你独一能做的事变就是要包管你的指针在不利用时要被开释。你也能经由过程智能指针来操纵原指针,比方经由过程它来挪用成员函数。假如被挪用库已为你请求了空间而又但愿你经由过程句柄来开释的话,使用智能指针封装起句柄并使用定制的析构器来开释内存无疑是一种公道的选择。
  原文链接:stackoverflow翻译:伯乐在线-Licorice
系统安全相关命令:passwd、su、umask、chgrp、chmod、chown、chattr、sudo、pswho
飘灵儿 该用户已被删除
沙发
发表于 2015-1-18 07:47:30 | 只看该作者
从2月21号开始看的,算下来已经1个多月了,每天看2-3个小时左右。本身C的基础挺好的,几本经典的C语言书都看过。
老尸 该用户已被删除
板凳
发表于 2015-1-25 16:29:37 | 只看该作者
在C++里边就成读者负担了!
简单生活 该用户已被删除
地板
 楼主| 发表于 2015-2-3 11:42:20 | 只看该作者
但是这样的好处是很多的,用string和vector可以很早的写出很有用的程序,而不用考虑内存分配与指针问题。
蒙在股里 该用户已被删除
5#
发表于 2015-2-8 21:41:43 | 只看该作者
在看别人程序时,不要连什么this 指针呀,继承、派生、友员都搞不清楚,学了一个多月,小有点心得!总结如下:
若相依 该用户已被删除
6#
发表于 2015-2-26 11:40:07 | 只看该作者
我也学习了几天VB,然后不敢示弱得心把我拉回去,也不知道怎么回事,有一天灵感光顾,就这样,轻松进门,只用了一周。以后学习数据库编程,Socket编程也遇到类似得情况,
兰色精灵 该用户已被删除
7#
发表于 2015-3-8 14:42:56 | 只看该作者
在C++里边就成读者负担了!
愤怒的大鸟 该用户已被删除
8#
发表于 2015-3-16 03:36:53 | 只看该作者
说起来,C++Primer和那本Plus思路不一样,这本书第3章就开始教你用标准库,用string对象与vector容器,所以对基础薄弱的同学来说上手有点难。
莫相离 该用户已被删除
9#
发表于 2015-3-22 20:06:45 | 只看该作者
经过这周的实训,我收获颇多,从中发现了自己的不足之处,也增长了很多见识。在此,要感谢我们的指导老师邹锋,感谢他一周以来的耐心教导。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-17 22:15

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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