V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
kevinyoung
V2EX  ›  Python

都说 c++难学,为什么我觉得大部分概念都能在 Python 中找到对应,只是要记的东西略多

  •  
  •   kevinyoung · 2015-07-11 12:28:15 +08:00 · 12546 次点击
    这是一个创建于 3428 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如题。有Python和c基础,最近在看c++,坊间传闻c++非常难学,我也是提起了十二分的精神,结果看下来觉得除了语法以外没什么新东西,基本上每个概念都能在Python中找到对应,看了几个小时已经可以开始写项目了...这样科学吗?

    哦对了,模板那块儿还没看,但想来也不过是为了用静态语言实现动态语言的特性而创造出来的东西,用好可能不容易,但概念上确实不新鲜..
    第 1 条附言  ·  2015-07-12 00:52:21 +08:00
    统一回复一下:把c++当成带类的c xxxx 这样的说法

    我看c++就是因为用c写面向对象太蛋疼了,还要每次实现一些标准库里应该有的东西,所以至少现在c++对我来说就是带类还有标准库的c而已。

    我不明白的是这样为什么就应该被鄙视了,我们学习变成语言难道不是为了解决问题。把c++当成带类的c可以让我写出能解决我的问题的代码,这不就够了吗?难道非得把十八般武艺都用在一个项目里才行?

    另外也有朋友提到团队协作的时候如果大家各凭喜好地用不同特性写是没法合作的,所以我觉得给大家限定一个子集(比如只用到面向对象部分的特性)可能是个不错做法。
    87 条回复    2015-07-13 21:37:55 +08:00
    linxy
        1
    linxy  
       2015-07-11 12:44:55 +08:00
    C++包括
    1,面向对象 (virtual继承 shared_ptr之类的
    2, 模板 然而还分为type rich programming 和meta programming 还有Loki这种东西…
    3,函数式 如今有lambda ,也能玩出花来
    4,过程式。

    感觉每一个都可以学可两三年吧。
    Mirana
        2
    Mirana  
       2015-07-11 12:55:19 +08:00
    光看书就会做菜的话,我早成大厨了
    jsyangwenjie
        3
    jsyangwenjie  
       2015-07-11 12:58:19 +08:00
    到你用到的时候你就知道为什么C++难学饿了
    msg7086
        4
    msg7086  
       2015-07-11 12:58:44 +08:00
    光一个模板就能干死你。

    概念当然都不难。一个编程语言还能有哪些概念……一个语言里实现的东西大都会散播到其他语言上去。
    就说函数式风格编程,lambda表达式这些比较新的概念,c++最近也已经支持了。更不用说泛型&模板这些东西了。

    然而你并不能都用好。
    typcn
        5
    typcn  
       2015-07-11 13:04:47 +08:00
    并不难,是半吊子太多了(虽然我也是?
    lilydjwg
        6
    lilydjwg  
       2015-07-11 13:11:11 +08:00
    我也是学了 Python 之后才学得下 C++ 的,虽然并没有深入。

    C++ 对于我有如下已知点我还不了解:

    * boost
    * shared_ptr, unique_ptr, ....
    * copy constructor, move constructor, ...
    * 各种位置的 const、const_cast、mutable....
    * ....
    wizardoz
        7
    wizardoz  
       2015-07-11 13:11:20 +08:00
    难不是难在可以用它来开发项目,而是它具有的纷繁复杂的特性。如果在一个C++的团队里面开发的话你会发现各种人写出各种各样的代码。
    当然如果是一个Java程序员来用C++的话,完全可以摒弃C++一些特性,像用Java一样使用C++。
    我作为C程序员,可以摒弃更多的东西,当作C来使用。
    lilydjwg
        8
    lilydjwg  
       2015-07-11 13:13:05 +08:00
    有 C 和 Python 基础之后随便看看教程,写点 C++ 小程序当然没问题,毕竟现在你可以把它当成是「带类的 C」。
    bbdump
        9
    bbdump  
       2015-07-11 13:15:03 +08:00   ❤️ 1
    试试模版 各种隐式转换 虚指针 多态...这些东西没这么简单就能掌握
    wizardoz
        10
    wizardoz  
       2015-07-11 13:16:33 +08:00
    当然我觉得Python也挺难的,刚开始也觉得很简单。第一次接触Python,看了一下午《How to think like a computer scientist》就开始写程序了。但是后来真正想深入了解的时候,发现Python其实也没那么简单,好多概念还是不太容易理解。
    birdor
        11
    birdor  
       2015-07-11 13:18:47 +08:00   ❤️ 1
    如果能从无到有写一个 StringVector,支持所有 std::vector<string> 的接口,性能也不逊色,而且实现的过程中不用互联网,只参考 C++ 的基础文档,那就入门成功了。
    est
        12
    est  
       2015-07-11 13:32:08 +08:00
    觉得简单的,加上一个多线程就直接跪了。
    billwsy
        13
    billwsy  
       2015-07-11 13:33:25 +08:00 via iPhone
    我觉得Python才难学,最近写的要疯了…
    typcn
        14
    typcn  
       2015-07-11 13:34:21 +08:00
    @lilydjwg boost 只是一个库,照着 example 用就行了,挺方便的
    Clarencep
        15
    Clarencep  
       2015-07-11 15:15:30 +08:00
    一千个人眼中有一千个C++。 还曾见过一个团队的C++只用不准用new只准malloc,写class只准用静态函数,不准用std的库,boost库也不用,哎~活脱脱就是那C++当C用...
    womaomao
        16
    womaomao  
       2015-07-11 15:16:49 +08:00
    题主能否说出C++对象的内存模型,虚函数怎么实现多态的?
    Ncer
        17
    Ncer  
       2015-07-11 16:00:52 +08:00
    当成带类的C来看当然不难
    endrollex
        18
    endrollex  
       2015-07-11 16:05:04 +08:00
    C++不难,就是光C++只能撸黑屏,玩不了最流行的Web
    KDr2
        19
    KDr2  
       2015-07-11 16:07:21 +08:00   ❤️ 1
    realityone
        20
    realityone  
       2015-07-11 16:10:40 +08:00
    fo2w
        21
    fo2w  
       2015-07-11 16:13:03 +08:00
    talk is cheap, show me the code
    ilotuo
        22
    ilotuo  
       2015-07-11 16:19:40 +08:00 via Android   ❤️ 1
    找个好工程
    如android的binder机制实现原理
    里面的虚函数跳来跳去 对虚函数表没个概念你根本看不懂
    yahoo21cn
        23
    yahoo21cn  
       2015-07-11 16:26:31 +08:00   ❤️ 2
    现在都面向搜索引擎编程了,用什么语言都一样
    ChangxuBlack
        24
    ChangxuBlack  
       2015-07-11 16:33:50 +08:00
    模板元编程在Python里有什么对应?
    nozama
        25
    nozama  
       2015-07-11 19:30:35 +08:00 via Android   ❤️ 1
    cxx的精髓在于RAII
    qecxp
        26
    qecxp  
       2015-07-11 19:47:00 +08:00
    @nozama cxx的精髓在于RAII

    这个说法有什么权威出处吗?还只是你自己感悟?
    znoodl
        27
    znoodl  
       2015-07-11 20:07:40 +08:00
    把东西写出来很简单,但是要能稳定运行,要各种安全检查有很多事要做呢
    mozartgho
        28
    mozartgho  
       2015-07-11 22:31:26 +08:00
    楼主给大家讲讲虚继承时,对象模型建立过程吧!
    leavic
        29
    leavic  
       2015-07-11 22:34:33 +08:00
    我用C++就是当做有类的C来用,那是相当容易,分分钟让我觉得我用C的结构体都可以创造出C++了。
    chaucerling
        30
    chaucerling  
       2015-07-11 22:49:29 +08:00
    只是会了 c with class 而已
    realpg
        31
    realpg  
       2015-07-11 22:54:09 +08:00   ❤️ 1
    个人觉得,你学会使用它并不难

    你用它去实现90%的应用需求也都很简单

    但是,这是一个可以翻出各种花样的语言

    你不可能一辈子不跟别人合作开发

    你不可能一辈子不用别人的轮子

    你也不可能让别人不玩出花样

    要跟各种花样的代码去合作整合时候

    看了他们的代码我怎么觉得自己什么都不会。
    kevinyoung
        32
    kevinyoung  
    OP
       2015-07-12 00:16:29 +08:00
    @linxy 正好在隔壁知乎看轮大的答案,怎么跟你说的一模一样啊。

    这几项确实每一样都够看个几年的,但其实有很多东西都是语言无关的,比如面向对象或者函数式的思想都可以抽出来考量,也可以在其他语言下学习,所以都算作c++的范畴我觉得有点不公平。
    kevinyoung
        33
    kevinyoung  
    OP
       2015-07-12 00:17:15 +08:00
    @Mirana 所以要使劲儿造轮子啊
    kevinyoung
        34
    kevinyoung  
    OP
       2015-07-12 00:21:25 +08:00
    @jsyangwenjie 肯定是这样的。不过正经写项目的话还有一层复杂度在架构设计上,我觉得这也不能算是c++难吧。

    另外一般写项目应该会把使用到的特性限定在一个范围内,所以没有人敢说自己精通c++但不妨碍拿一个子集来写有用的项目吧。
    linxy
        35
    linxy  
       2015-07-12 00:22:04 +08:00 via Android
    @kevinyoung 因为刚好看到他答案,参考一下喽~
    kevinyoung
        36
    kevinyoung  
    OP
       2015-07-12 00:25:24 +08:00
    @msg7086 嗯,模板确实还没来得及看,不过我理解模板的作用一个是实现动态语言比如多态这样的特性,一个是提供一个比c的macro更健康的元编程途径。

    用纯c做这些事情的话怎么看都是在hack,c++虽然试图提供一个更好的法子,但用起来肯定不可能舒服了。
    kevinyoung
        37
    kevinyoung  
    OP
       2015-07-12 00:25:43 +08:00
    @typcn 哈哈
    kevinyoung
        38
    kevinyoung  
    OP
       2015-07-12 00:28:32 +08:00
    @lilydjwg 感觉c++这些边边角角的地方确实多,一开始我都跳过去了,回头有时间再慢慢磨吧..
    kevinyoung
        39
    kevinyoung  
    OP
       2015-07-12 00:30:05 +08:00
    @wizardoz 团队协作的话我记得有人提过他们连编码风格都要统一一下的,所以难道不应该对大家用到的特性做一个约束吗?
    kevinyoung
        40
    kevinyoung  
    OP
       2015-07-12 00:34:08 +08:00
    @lilydjwg 不知道为什么大家都爱那这句说事儿。

    我看c++就是因为用c写面向对象太蛋疼了,还要每次实现一些标准库里应该有的东西。所以至少现在c++对我来说就是带类还有标准库的c,so what?我觉得很好用,能解决我的问题,这不就够了?学语言又不是为了装...
    kevinyoung
        41
    kevinyoung  
    OP
       2015-07-12 00:35:55 +08:00
    @wizardoz 嗯,Python确实包罗万象,我其实花了一两年在看Python,甚至还看了Python的源码,结果涨的是c的功力..
    kevinyoung
        42
    kevinyoung  
    OP
       2015-07-12 00:37:13 +08:00
    @est 多线程/进程 模型是独立于语言之外的概念吧,把这个也算在c++的复杂度里我觉得不公平。
    kevinyoung
        43
    kevinyoung  
    OP
       2015-07-12 00:37:54 +08:00
    @billwsy 我觉得你可能不是觉得Python难学,而是实际写项目的时候动态语言的特性会出一些很奇怪的问题..
    linxy
        44
    linxy  
       2015-07-12 00:37:55 +08:00 via Android   ❤️ 1
    其实可以看看Rust
    kevinyoung
        45
    kevinyoung  
    OP
       2015-07-12 00:39:56 +08:00
    @Clarencep 我觉得这样或许有道理,如果没法保证团队的人都能用c++的特性写出质量足够的代码的话,那么不如限制的死一点当c用好了,这样至少保证写出的项目的质量。
    kevinyoung
        46
    kevinyoung  
    OP
       2015-07-12 00:42:29 +08:00
    @womaomao 才开始看两三天,这些东西还没来得及看。

    不过我试过用c实现面向对象系统,内存模型和虚函数这些东西想来也玩不出什么新花样来。
    tencoldays
        47
    tencoldays  
       2015-07-12 00:42:52 +08:00
    屎难吃,并不代表吃屎是种伟大的能力。
    kevinyoung
        48
    kevinyoung  
    OP
       2015-07-12 00:42:59 +08:00
    @womaomao 嗯,一个猜想,不一定对。
    kevinyoung
        49
    kevinyoung  
    OP
       2015-07-12 00:52:54 +08:00
    @Ncer 见附言。
    kevinyoung
        50
    kevinyoung  
    OP
       2015-07-12 00:53:25 +08:00
    @endrollex 哈哈

    不过c++还能写gui的吧
    kevinyoung
        51
    kevinyoung  
    OP
       2015-07-12 00:54:58 +08:00
    @fo2w 呃,被你将军了,确实没什么拿得出手的code...
    kevinyoung
        52
    kevinyoung  
    OP
       2015-07-12 00:56:05 +08:00
    @ilotuo 等下,android的应用不是用java写的?
    kevinyoung
        53
    kevinyoung  
    OP
       2015-07-12 00:57:46 +08:00
    @ChangxuBlack Python的class可以用type函数在运行时生成,至于个中attributes和methods也可以在运行时绑定,不知道这是不是你要的?
    kevinyoung
        54
    kevinyoung  
    OP
       2015-07-12 01:00:24 +08:00
    @znoodl bingo。但代码健壮性的部分总也不能算作是c++的内容吧?
    kevinyoung
        55
    kevinyoung  
    OP
       2015-07-12 01:01:03 +08:00
    @mozartgho 还没来得及看,随后看了以后如果有机会我就写一个帖子。
    kevinyoung
        56
    kevinyoung  
    OP
       2015-07-12 01:02:20 +08:00
    @leavic 确实。只有面向对象部分的话不难。
    kevinyoung
        57
    kevinyoung  
    OP
       2015-07-12 01:02:39 +08:00
    @chaucerling 见附言。
    msg7086
        58
    msg7086  
       2015-07-12 01:05:54 +08:00 via Android
    插一句。其实多条回复可以放在一层楼的…
    JeffreyLau
        59
    JeffreyLau  
       2015-07-12 01:07:38 +08:00 via Android
    回复楼主那个统一回复:虽然我没写过大项目,但是我觉得c+class就能搞定的项目算不上是项目,顶多算教材课后题吧
    kevinyoung
        60
    kevinyoung  
    OP
       2015-07-12 01:09:54 +08:00
    @msg7086 是同时@多人吗?
    kevinyoung
        61
    kevinyoung  
    OP
       2015-07-12 01:12:04 +08:00
    @JeffreyLau 嗯,我平时也就写一些模型的模拟,几千行就撑死了,确实算不上项目。

    比较好奇,如果真是在写项目的话会用到那些特性?
    ChangxuBlack
        62
    ChangxuBlack  
       2015-07-12 01:12:32 +08:00
    @kevinyoung 不是,这个和模板元编程不一样。。。模板元编程可以在编译时期完成类型推导乃至数值计算,以提升程序执行效率。。。模板元编程博大精深,最经典的应用是eigen和boost。。。目前没有其他语言有C++这么强大的模板元编程吧?
    ChangxuBlack
        63
    ChangxuBlack  
       2015-07-12 01:14:03 +08:00
    @typcn boost的spirit和mpl你觉得如何呢?
    ChangxuBlack
        64
    ChangxuBlack  
       2015-07-12 01:17:20 +08:00
    @kevinyoung 模板的作用更多的体现在编译,而不是执行。。。可以看看《C++ Templates》
    rcmerci
        65
    rcmerci  
       2015-07-12 01:18:22 +08:00
    lz去看看modern c++ design这本书试试把。
    msg7086
        66
    msg7086  
       2015-07-12 01:20:57 +08:00   ❤️ 1
    @kevinyoung 是的。

    @kevinyoung 比如这样。

    当然一般只用在比较短的回复上,不至于把页面拉得很长,看起来轻松点。
    长回复还是放单条好。
    kevinyoung
        67
    kevinyoung  
    OP
       2015-07-12 01:24:21 +08:00
    @ChangxuBlack 我明白你的意思。模板元编程无非就是为了让c++这种静态语言也具备多态以及元编程能力,只不过到底还是静态语言,所以很多工作要在编译期完成,但不管怎么样写起来和动态语言很像了目的就达到了。
    kevinyoung
        68
    kevinyoung  
    OP
       2015-07-12 01:25:56 +08:00
    @rcmerci 书单一大堆,但这两年都不确定有时间看了...毕竟主业还是看论文发论文....但还是谢谢
    sinxccc
        69
    sinxccc  
       2015-07-12 01:30:12 +08:00
    @JeffreyLau 以语言论项目大小是个很没意义的事儿。
    kevinyoung
        71
    kevinyoung  
    OP
       2015-07-12 01:33:54 +08:00
    @ChangxuBlack 受教了。这样提前就算好的做法确实跟作弊一般,嘿嘿。
    ncwhale
        72
    ncwhale  
       2015-07-12 04:58:52 +08:00 via Android
    @endrollex 什么鬼喵…我这里早就C++做基础可以跑Webkit做界面再底层HTTP Push各种视频音频照片控制机器人了喵…说不能的是等着脸肿喵?
    loading
        73
    loading  
       2015-07-12 06:39:31 +08:00 via Android
    难是相对的,你也说了要记的东西多了,用起来就更复杂了,只有到真正用到的特性时,你才会明白的,光看语法那是小学生。
    Taojun0714
        74
    Taojun0714  
       2015-07-12 07:39:09 +08:00
    @msg7086 就跟python没有函数式编程似得,好像支持的比C++还早还好吧
    linux40
        75
    linux40  
       2015-07-12 07:51:06 +08:00 via Android
    auto和static都不同
    linux40
        76
    linux40  
       2015-07-12 07:52:03 +08:00 via Android
    表达式也不同
    linux40
        77
    linux40  
       2015-07-12 07:53:14 +08:00 via Android
    数组也不同。。。
    msg7086
        78
    msg7086  
       2015-07-12 08:44:12 +08:00
    @Taojun0714 我就是拿python的函数式和lambda举例子的啊?
    我说现在连C++也开始支持了,有什么问题么……
    lijianying10
        79
    lijianying10  
       2015-07-12 09:14:26 +08:00   ❤️ 1
    其实楼主想多了。
    问题不在语言上,你没有实际业务来考量两个语言当然是从语法上啊。

    当你处理高并发环境下的TCP连接问题时。眼看着连接服务器就要扛不住了的时候。
    当你处理信号,大规模加密解密,视频,图形,矩阵,(Intel IPP 可针对CPU型号优化,虽然有SciPY依然酸爽)
    当你处理HTTP业务时。C++就会变得很酸爽。
    当你做数据可视化的时候(Python各种方案,各种方便各种爽,但是C++我只了解Cern ROOT晦涩难懂)
    当你了解ICPC的时候,当你知道MIC这种性能怪物的时候。

    这两种语言的区别就是各花入各眼了。
    不必纠结,多做了解,多跟实战工程师聊聊Case你就不会这么纠结了。

    比如说银行用的TCP连接是怎么做的技术细节这些,别人集群都干什么了。
    海尔等这种大公司的企业级应用是中心化的还是分布式的?怎么处理的?

    接触语言时千万不要忘记业务。
    希望能帮到楼主,祝楼主武运昌盛。
    benjiam
        80
    benjiam  
       2015-07-12 09:38:38 +08:00 via iPad   ❤️ 1
    可以去看effect 系列,了解各种坑
    sgissb1
        81
    sgissb1  
       2015-07-12 10:35:10 +08:00   ❤️ 1
    这个某种语言当初设计时候的分工有关

    就像汇编一样,概念多简单。但写个东西试试。谁用就觉得烧脑子。
    c和c++的设计,当时就是为了解决让人类能“看懂”的分工设计的。

    在c/c++之前还有很多语言,都是由于种种原因用途很有针对性。
    c/c++这类已经算比较偏底层(没有汇编那么底层),用起来才真能感受到难。

    你觉得学的容易,用起来容易。而是你把他当作python这类解决实际的一些工程问题的语言去对待了。
    lilydjwg
        82
    lilydjwg  
       2015-07-12 12:40:39 +08:00   ❤️ 1
    @kevinyoung 「带类的 C」么?这是 C++ 原本的设计目的啊。没见过也不知道别人都拿这句话做什么了,反正我觉得初学者把 C++ 当成带类的 C 挺好的。随着使用的深入会渐渐遇到各种 C++ 的特性,到时候学习就可以了。当然不可能一直这么做,因为现在的 C++ 早已不是以前了。
    lincanbin
        83
    lincanbin  
       2015-07-12 13:31:24 +08:00 via Android
    编译型语言的面向对象没有解释型的用起来爽,有时候追加个方法什么的。
    oska874
        84
    oska874  
       2015-07-12 14:00:30 +08:00
    看了附言,感觉题主只需要用到c++ 很少的一部分,所以觉得c++ 不难,那是你没有用到C++ 的精髓,只是当作超C 在用,当然觉得没啥了,但是你一旦深入了,就会发现到处都是坑。
    C 也一样,语法超简单,但是用起来不简单,真正用到工程里面了会出现各种不可遇到的问题需要你去解决。
    不恰当的比喻,好比给了一把菜刀,你只用来切豆腐当然觉得很切菜很简单了,但是让你用去雕萝卜,呵呵。
    ChangxuBlack
        85
    ChangxuBlack  
       2015-07-12 15:08:28 +08:00   ❤️ 1
    @kevinyoung eigen就是靠模板元编程获得了变态级别的效率(BLAS库里数一数二快的了),boost的MPL非常难学。。。BOOST还有个东西叫spirit,靠模板元编程生成针对领域特定语言的编译器,这个最酷了,详见http://boost-spirit.com/home/
    kamushin
        86
    kamushin  
       2015-07-13 01:35:27 +08:00   ❤️ 1
    看过effective C++和深入C++对象模型。不过没啥C++实际工程经验。
    我的感受是楼主对于语言的复杂度估计还停留在语法糖数量上。
    C++难不在什么模板编程,这玩意V友有多少会去写?我坦言只写过求n!的模板编程。。。
    C++难学是因为它把太多东西暴露给你了。
    >>>C++什么时候会给你一个默认的构造函数?
    <<<在我没有写构造函数的时候?
    >>>错了,C++只会在你没写构造函数且你的类成员有构造函数,基类有构造函数,有虚函数,有虚基类这四种情况下,为你产生一个空得构造函数
    <<<F**K ME. Life is too short for C++ Standard, I use Python.
    ChangxuBlack
        87
    ChangxuBlack  
       2015-07-13 21:37:55 +08:00
    @kamushin 嗯是的,我觉得C++的难就难在它支持多种编程范型
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1262 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 18:15 · PVG 02:15 · LAX 10:15 · JFK 13:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.