猫史档案馆


【大家好!】一个有关C++的问答:你的回答是多少?

用户:爵士OIer爵士OIer查看:280 回复:29 评论:26 创建时间:2019-10-04T20:05:29


C++:
完全不会,1;

会一些,2;

会算法的,3;   <--我的位置

会进行应用程序的,4;

最后问一下,类、继承是什么意思?


回复

上一页第 1 页 / 共 1 页下一页
星空之忆星空之忆

2吧

点赞0


评论


克雷寄寄克雷寄寄

22

点赞0


评论


暗渐消亡暗渐消亡

喵喵喵11111111

 

点赞0


评论


天马神坑_真天马神坑_真

3

点赞0


评论

哇厉害

交个朋友,一起交流呗


4O3F0rbidden4O3F0rbidden

2  

点赞0


评论


东雪莲东雪莲

1.。。

点赞0


评论


爵士OIer爵士OIer

星空之忆awa 你知道算法是什么吗  

点赞0


评论

当然知道。。。

打错了,是他:AWM狙击枪

emmm


爵士OIer爵士OIer

我也是3

 

点赞0


评论


爵士OIer爵士OIer

还有

类

继承

之类的

什么意思?

点赞0


评论


爵士OIer爵士OIer

求解答

点赞0


评论


爵士OIer爵士OIer

真的不懂

点赞0


评论


急_开_锁_办_证810864急_开_锁_办_证810864

编程无法都是想办法解决2个大问题:方法效率的提升和模块划分的优化。前者是算法学习的重心,后者是大型软件架构课程的学习重点。算法面对的问题是一次性提出的、输入输出比较明确的问题,问题固定但是难度大;架构设计中面临更多的是会随时变更的功能需求(客户经常会突然改变想法,或者软件经常需要对已有功能进行升级,但又不希望影响到现有的其它功能,以免引发新的bug),以及多人参与的大型项目开发如何划分职责和进行功能整合的问题,问题难度不一定大但是经常遇到程序开发到一半后功能需求可能发生临时变化,或者是开发到一半的时候工程师突然跳槽、必须换人接手的尴尬,所以进行架构设计需要拥抱变化。

 

C语言里有结构体类型,类似Pascal语言的record类型,可以把与特定事物的所有相关数据全部整合到一起。这样管理大量不同类型数据的时候,不容易混乱,使程序便于阅读。使用结构体,可以方便地构造各种除数组(阵列)以外的其它常见数据结构,而且比不使用结构体的做法更为简单易懂。

 

那个年代的程序就如Pascal语言之父用公式概括的:程序=数据结构+算法。其中出现了2个影响力最大的流派。以数据结构为核心的编程,其代表就是C语言家族(C++、Java、Python、C#、PHP、JavaScript、Flash ActionScript、Rust、Golang等等),讲究用函数操作数据结构,函数是为数据结构服务的,就是面向过程的编程(没有返回值的函数就叫做过程(procedure))。另一种以函数为核心的编程(也就是允许把普通函数也当做数据一样在高阶函数中传来传去的),代表是Lisp语言家族(比如CAD AutoLisp、Mathematica Wolfram (IPython notebook / Jupyter就是抄它的notebook设计)),认为函数才是一等喵,这种做法更接近数学语言,就是函数式编程。

 

后来SmallTalk语言诞生后,作者提出了面向对象编程(OOP)的理念,认为程序应该划分为1个或多个类,程序各部分之间的关系应该看成是类与类之间的交互(子类还可以通过继承获得父类的已有功能,减少代码量),而不是一大堆全局函数之间的调用。作者认为大堆全局函数之间的调用的缺点在于难以理清头绪,进而难以调试bug,也难以扩展新功能。

 

C语言中的结构体只能定义一系列的不同数据,将其视为一个整体进行操作。C+喵结构体增强了功能,为其提供了自定义“方法”的功能,也就是可以把函数绑定给结构体,称为结构体特有的“方法”,从而既可以操作数据,又减少了全局函数。当然面向对象编程走得更远,在结构体的设计思想上,创造出了封装、继承、多态这三大全新设计。

 

如果我有1个类代表动物,它可以有自己的数据(种类、年龄、身高、体重等等)和一些可以调用的特有功能(移动、进食、显示自身信息)。那么如果我再创建1个企鹅类,那么在声明这个企鹅类的时候,只需要指明它继承动物类,那么动物类已经有的全部功能,就不需要在企鹅类中再敲一遍代码了。只需要书写企鹅类独有的(而普通动物不一定有的)其它数据和功能(比如游泳)即可。

 

又比如你写打喵的喵游戏。你可以先设置1个通用的喵类Gun,在类的定义中规定它应该有的数据属性(价格、容量、上弹速度)和功能(喵)。等你需要设计1把喵的时候,你可以使喵类继承Gun类,然后只需单独规定喵特有的属性和功能(比如喵的类型和喵的外形编号)即可。等你需要设计1把喵喵的时候,你可以使喵喵类继承Gun类,然后只需单独规定喵喵特有的属性和功能(比如所用喵的种类)即可。你需要设计的喵越多,越能感觉到类的继承功能带来的方便,可以省写很多通用的功能。反过来,如果你需要修改喵喵特有的功能,只需要修改喵喵的类即可;如果你需要修改所有喵的某种属性数值或功能实现方式,只需要去所有喵的父类Gun中修改对应的一处代码即可,不需要一个喵一个喵地去改,那样太费时费力了。所以说,继承的好处是双向的。

 

这里只是体现继承带来的好处,封装、多态同样也有它们各自的优势,包括降低不同模块之间的彼此依赖(便于进行功能升级和替换)、实现更优雅的面向接口编程等。

 

以数据结构为核心的编程从此出现了面向对象这个全新的分支。人们在推崇面向对象的过程中,逐渐发展出了所谓的设计模式。设计模式专门讨论如何利用面向对象的特点,对大型程序进行功能分解、设计和维护,把程序分为不同的类,相似的类再根据共同点合并出公共的父类,类多了以后还可以进行分层次的抽象,最终的目的都是把程序功能清晰地划分为多个小模块,使各功能模块的职责分明、查错和扩展都更加方便。大型程序的编程变成了围绕设计模式的编程,研究OOP特有的设计模式成为了软件架构师的必修课。

点赞0


评论

查了一下维基,OOP的始祖应该是Simula语言,SmallTalk语言只是第一个广泛流行的OOP语言。

类就是C语言中结构体的升级版,你会用结构体的话,大体就能明白类是干什么的。不过相比普通的结构体,类还多增加了封装、继承、多态这3个新特性,由此产生了更多的新玩法和设计思想。C++作者和Java作者也会买一些介绍自己所发明的语言的教程看,说明即使是语言的设计者也无法预料到语言的未来趋势和各种语法的最佳用途,需要从其他有经验的编程高手中获得对自己有益的经验。

结构体我当然知道

大佬

以前在一本UML书里看到过,说面向对象编程有1个终极目标,就是实现:只要以画出类示意图(叫做UML)的形式,指明程序需要多少个类、以及各个类的各自职责和相互关系,程序代码就能由计算机全自动编写出来。这是一个很有意思的远大目标,目的是把大型软件的编程这件事喵化、自动化,减少人工编程的繁琐。

也有部分军工行业不流行OOP风格的语言。很大一部分原因是大量的(往往是超过百万行的)遗留的代码都是几十年前以Fortran等原始语言编写的,OOP风格虽说看似总体结构更优化,但用OOP语言重构全部旧代码的代价太大,而且要是出了不易察觉的bug的话后果非常危险(比如现有导弹系统或核反应堆的遗留代码一般只要能正常使用就不会有人敢去乱改),而且旧代码的安全性都是经过几十年时间充分检验了的。

OOP并未一统天下。军工业程序需求简单喵变化少、追求算法效率,OOP编程风格无法发挥出其利于修改和扩展功能的优势。带头黑OOP的大佬是Linux的作者L. Torvalds老贼(写下名言"Talk is cheap, show me the code."的那位)。此君认为C++加入OOP特色是画蛇添足,说某些微软程序员推崇OOP是没有水平的表现。此君是顶级C高手,但是也难免会有语言喵链观点。

你不也是未来的大佬么。

所以说我现在还不是大佬啊

你来我们工作室吧,C++大佬

我不是大佬


爵士OIer爵士OIer

结构体我当然知道

点赞0


评论


爵士OIer爵士OIer

如果我有1个类代表动物,它可以有自己的数据(种类、年龄、身高、体重等等)和一些可以调用的特有功能(移动、进食、显示自身信息)。那么如果我再创建1个企鹅类,那么在声明这个企鹅类的时候,只需要指明它继承动物类,那么动物类已经有的全部功能,就不需要在企鹅类中再敲一遍代码了。只需要书写企鹅类独有的(而普通动物不一定有的)其它数据和功能(比如游泳)即可。

这个就完全了解了,谢谢

点赞0


评论


绿影翼龙『鸽阁』绿影翼龙『鸽阁』

2

点赞0


评论

你学到哪里了?


红烧汤圆红烧汤圆

1 

点赞0


评论


TechnetiumTechnetium

2 

点赞0


评论


宇轩yu_xuan宇轩yu_xuan

3到4之间吧

点赞0


评论

恩 不错


编码已破译编码已破译

0.0001(我听说过C++)

点赞0


评论

同一个工作室的,为何你如此优秀?


FATAL_ERRORFATAL_ERROR

求助大佬!!!最佳路径算法到底是啥???

点赞0


评论

《信息学奥赛一本通》我只会第一部分的一到第六章!!!

说清楚一点,他的解释是怎么样的?

Floyed算法懂了,但是Dijkstra不太懂:(

加我们的工作室一起研究吧。

Dijkstra的最短路径算法我第一次也看了大半天。传说Dijkstra爷爷只用了20分钟就发明了这个算法。

广度优先搜索思想


HJS001HJS001

2

点赞0


评论


wzh666666wzh666666

3

 

点赞0


评论


湖西湖西

一个也不会

点赞0


评论


爵士OIer爵士OIer

呃 

点赞0


评论


硫酸QwQ硫酸QwQ

1.1,知道有C++这个东东(滑稽)

点赞0


评论


爵士OIer爵士OIer

额莪欸

点赞0


评论


急_开_锁_办_证810864急_开_锁_办_证810864

提到Dijkstra,他在我眼中是个非常了不起的学科偶像。我学编程的动机是想自己做游戏,所以最先接触的就是A*算法,所以与之相关的Dijkstra是我认识的第一个研究算法的名人。后来发现在计算机的各个领域都能见到他的名字,才知道他不是与比较其他一般的算法提出者可以相提并论的小角色,他的成就特别多、特别广,在计算机史上的地位与Euler在数学中的地位相当。他刚进入这个领域时,计算机程序员还不是一个正式职业,在学术界和普通大众中都被普遍瞧不起;当他离开这个领域时,无论是算法研究,还是计算机工程方法学,都能见到他留下的足迹。goto语句有害论以及结构化程序设计思想是他提出的,调度场算法、算式表达式的双栈计算法是他发现的,关于多线程竞争的哲学家就餐问题也是他第一个提出和研究的。还有一些后来并不以他命名的算法,也曾被他独立发现过。他是学理论物理出身的,物理的简洁与优雅的风格在他的成就中也得到了极大的体现。

 

最短路径算法貌似是Dijkstra的第一个知名成就,对他的人生有着特殊的意义。但是,Dijkstra发现这个算法后,很长时间都不好意思拿出去发表,怕数学家嫌弃他的发现没有价值。20世纪是抽象数学高度发展的喵,布尔巴基学派领导的代数几何学研究主导了20世纪中期数学发展的话语权,他们同时把涉及计算性的问题全部扔出了主流数学。20世纪最伟大数学家的前2名都被布尔巴基学派的Grothendieck和Serre占据了,其学派的实力和影响力可见一斑。布尔巴基学派的早期领袖Andre Weil甚至对当时新出现并快速发展的相对论和量子力学完全看不上眼。数学家只对研究无穷大和无穷维度空间的高等课题感兴趣,许多应用性的数学在数学界都是处于数学喵链的下游,至于与计算机相关的数学研究基本上是没有存在感的,所以后来Knuth才提出计算机需要用到的离散数学应该独立为学科。Dijkstra在这个喵选择了远离主流热点,做一个默默从事计算机基础理论研究的大胆的拓荒者,后来正好赶上了20世纪后期计算机高速发展的潮流,于是阴差阳错成为将整个计算机学科带大成人的超级大佬。

 

顺便推荐这本介绍计算机名人历史的书(早期的翻译版本叫做《大师的智慧》):

center_image

center_image

center_image

center_image

center_image

center_image

点赞0


评论

数学是一切理工学科的基础,Dijkstra也提到了对自己没有受过像数学系学生一样专业的高等数学训练感到遗憾。


爵士OIer爵士OIer

二十一是

点赞0


评论


爵士OIer爵士OIer

粉离自行生产的v方便给你还没解开

点赞0


评论