所有栏目 | 云社区 美国云服务器[国内云主机商]
你的位置:首页 > 云社区 » 正文

如何自学C++?

发布时间:2020-04-12 08:42:50

资讯分类:自学c  如何  函数  查找  对象
如何自学C++?

本次回答邀请boolean,由他来分享自己在学习C++过程中踩过的那些坑~相信对自学C++的朋友会有帮助~

如果,将编程语言比作武功秘籍,C++无异于《九阴真经》。《九阴真经》威力强大、博大精深,经中所载内功、轻功、拳、掌、腿、刀法、剑法、杖法、鞭法、指爪、点穴密技、疗伤法门、闭气神功、移魂大法等等,无所不包,C++亦如是。

C++跟《九阴真经》一样,如果使用不当,很容易落得跟周芷若、欧阳锋、梅超风等一样走火入魔。这篇文章总结了在学习C++过程中容易走火入魔的一些知识点。为了避免篇幅浪费,太常见的误区(如指针和数组、重载、覆盖、隐藏等)在本文没有列出,文中的知识点也没有前后依赖关系,各个知识点基本是互相独立,并没有做什么铺垫,开门见山直接进入正文。

目录

1 函数声明和对象定义

2 静态对象初始化顺序

3 类型转换

3.1 隐式转换

3.2 显示转换

4 inline内联

5 名称查找

5.1 受限名称查找

5.2 非受限名称查找

6 智能指针

6.1 std::auto_ptr

6.2 std::shared_ptr

6.3 std::unique_ptr

7 lambda表达式

1 函数声明和对象定义

对象定义写成空的初始化列表时,会被解析成一个函数声明。可以采用代码中的几种方法定义一个对象。

    2 静态对象初始化顺序

    在同一个编译单元中,静态对象的初始化次序与其定义顺序保持一致。对于作用域为多个编译单元的静态对象,不能保证其初始化次序。如下代码中,在x.cpp和y.cpp分别定义了变量x和y,并且双方互相依赖。

    x.cpp中使用变量y来初始化x

    y.cpp中使变量x来初始化y

    如果初始化顺序不一样,两次执行的结果输出不一样,如下所示:

      如果我们需要指定依赖关系,比如y依赖x进行初始化,可以利用这样一个特性来实现:函数内部的静态对象在函数第一次调用时初始化,且只被初始化一次。使用该方法,访问静态对象的唯一途径就是调用该函数。改写后代码如下所示:

        getX()函数返回x对象

          y对象使用x对象进行初始化

            打印x和y值。通过这种方式,就保证了x和y的初始化顺序。

              3 类型转换

              这里只描述自定义类的类型转换,不涉及如算数运算的类型自动提升等。

              3.1 隐式转换

              C++自定义类型在以下两种情况会发生隐式转换:

              1) 类构造函数只有一个参数或除第一个参数外其他参数有默认值;2) 类实现了operator type()函数;

                上面定义了一个Integer类,Integer(int)构造函数可以将int隐式转换为Integer类型。operator int()函数可以将Integer类型隐式转换为int。从下面代码和输出中可以看出确实发生了隐式的类型转换。

                  隐式类型转换在某些场景中确实比较方便,如:

                  a、运算符重载中的转换,如可以方便的使Integer类型和内置int类型进行运算

                    b、条件和逻辑运算符中的转换,如可以使智能指针像原生裸指针一样进行条件判断

                      隐式类型转换在带来便利性的同时也带来了一些坑,如下所示:

                        构造函数隐式转换带来的坑。上述代码定义了一个Array类,并重载了operator==运算符。本意是想比较两个数组,但是if(arr1 == arr2)误写成了f(arr1 == arr2[0]),编译器不会抱怨,arr2[0]会转换成一个临时Array对象然后进行比较。

                          operator type()带来的坑。上述String类存在到const char *的隐式转换,strcat函数返回时String隐身转换成const char *,而String对象已经被销毁,返回的const char *指向无效的内存区域。这也是std::string不提提供const char *隐式转换而专门提供了c_str()函数显示转换的原因。

                          3.2 显示转换

                          正是由于隐式转换存在的坑,C++提供explicit关键字来阻止隐式转换,只能进行显示转换,分别作用域构造函数和operator(),如下所示:

                          1) explicit Ctor(const type &);2) explicit operator type();

                            用explicit改写Integer类后,需要进行显示转换才能与int进行运算,如下:

                              为了保持易用性,C++11中explicit operator type()在条件运算中,可以进行隐式转换,这就是为什么C++中的智能指针如shared_ptr的operator bool()加了explicit还能直接进行条件判断的原因。下面代码来自shared_ptr源码。

                                4 inline内联

                                内联类似于宏定义,在调用处直接展开被调函数,以此来代替函数调用,在消除宏定义的缺点的同时又保留了其优点。内联有以下几个主要特点:

                                a、内联可以发生在任何时机,包括编译期、链接期、运行时等;

                                b、编译器很无情,即使你加了inline,它也可能拒绝你的inline;

                                c、编译器很多情,即使你没有加inline,它也可能帮你实施inline;

                                d、不合理的inline会导致代码臃肿。

                                使用内联时,需要注意以下几个方面的误区:

                                1)inline函数需显示定义,不能仅在声明时使用inline。类内实现的成员函数是inline的。

                                  2)通过函数指针对inline函数进行调用时,编译器有可能不实施inline

                                    3)编译器可能会拒绝内联虚函数,但可以静态确定的虚函数对象,多数编译器可以inline

                                      4)inline函数有局部静态变量时,可能无法内联

                                        5)直接递归无法inline,应转换成迭代或者尾递归。下面分别以递归和迭代实现了二分查找。

                                          二分查找的递归方式实现。

                                            二分查找的迭代方式实现。

                                            分别调用二分查找的递归和迭代实现,开启-O1优化,通过查看汇编代码和nm查看可执行文件可执行文件符号,只看到了递归版本的call指令和函数名符号,说明递归版本没有内联,而迭代版本实施了内联展开。

                                            6)构造函数和析构函数可能无法inline,即使函数体很简单

                                              表面上构造函数定义为空且是inline,但编译器实际会生成如右侧的伪代码来构造基类成分和成员变量,从而不一定能实施inline。

                                              5 名称查找

                                              C++中名称主要分为以下几类:

                                              a) 受限型名称:使用作用域运算符(::)或成员访问运算符(.和->)修饰的名称。如:::std、std::sort、penguin.name、this->foo等。

                                              b) 非受限型名称:除了受限型名称之外的名称。如:name、foo

                                              c) 依赖型名称:依赖于形参的名称。如:vector<T>::iterator

                                              d) 非依赖型名称:不属于依赖型名称的名称。如:vector<int>::iterator

                                              5.1 受限名称查找

                                              受限名称查找是在一个受限作用域进行的,查找作用域由限定的构造对象决定,如果查找作用域是类,则查找范围可以到达基类。

                                                5.2 非受限名称查找

                                                5.2.1 普通查找:由内向外逐层查找,存在继承体系时,先查找该类,然后查找基类作用域,最后才逐层查找外围作用域

                                                  5.2.2 ADL(argument-dependent lookup)查找:又称koenig查找,由C++标准委员会Andrew Koenig定义了该规则——如果名称后面的括号里提供了一个或多个类类型的实参,那么在名称查找时,ADL将会查找实参关联的类和命名空间。

                                                    根据类型C的实参c,ADL查找到C的命名空间ns,找到了foo的定义。

                                                    了解了ADL,现在来看个例子,下面代码定义了一个Integer类和重载了operator<运算符,并进行一个序列排序。

                                                      上面的代码输出什么? 1 1 5 10吗。上面的代码无法编译通过,提示如下错误

                                                        operator<明明在全局作用于有定义,为什么找不到匹配的函数?前面的代码片段,应用ADL在ns内找不到自定义的operator<的定义,接着编译器从最近的作用域std内开始向外查找,编译器在std内找到了operator<的定义,于是停止查找。定义域全局作用域的operator<被隐藏了,即名字隐藏。名字隐藏同样可以发生在基类和子类中。好的实践:定义一个类时,应当将其相关的接口(包括自由函数)也放入到与类相同的命名空间中

                                                          把operator<定义移到ns命名空间后运行结果正常

                                                          再来看一个名称查找的例子。

                                                            这段代码编译时提示如下错误,我们用int *实例化D1的模板参数并给m_value赋值,编译器提示无法将int *转换成int类型,也就是m_value被实例化成了int而不是int *。

                                                            我们将代码改动一下,将D2继承B<int>改为B<T>,代码可以顺利编译并输出。

                                                              D1和D2唯一的区别就是D1继承自B<int>,D2继承自B<T>。实例化后,为何D1.m_value类型是int,而D2.m_value类型是int *。在分布式事务领域有二阶段提交,在并发编程设计模式中二阶段终止模式。在C++名称查找中也存在一个二阶段查找。

                                                              二阶段查找(two-phase lookup):首次看到模板定义的时候,进行第一次查找非依赖型名称。当实例化模板的时候,进行第二次查找依赖型名称。

                                                              D1中查找T时,基类B<int>是非依赖型名称,无需知道模板实参就确定了T的类型。

                                                              D2中查找T时,基类B<T>是依赖型名称,在实例化的时候才会进行查找。

                                                              6 智能指针

                                                              6.1 std::auto_ptr

                                                              std::auto_ptr是C++98智能指针实现,复制auto_ptr时会转移所有权给目标对象,导致原对象会被修改,因此不具备真正的复制语义,不能将其放置到标准容器中。auto_ptr在c++11中已经被标明弃用,在c++17中被移除。

                                                                6.2 std::shared_ptr

                                                                std::shared_ptr采用引用计数共享指针指向对象所有权的智能指针,支持复制语义。每次发生复制行为时会递增引用计数,当引用计数递减至0时其管理的对象资源会被释放。但shared_ptr也存在以下几个应用方面的陷阱。

                                                                1)勿通过传递裸指针构造share_ptr

                                                                  这段代码通过一个裸指针构造了两个shared_ptr,这两个shared_ptr有着各自不同的引用计数,导致原始指针被释放两次,引发未定义行为。

                                                                  2)勿直接将this指针构造shared_ptr对象

                                                                    这段代码使用同一个this指针构造了两个没有关系的shared_ptr,在离开作用域时导致重复析构问题,和1)是一个道理。当希望安全的将this指针托管到shared_ptr时,目标对象类需要继承std::enable_shared_from_this<T>模板类并使用其成员函数shared_from_this()来获得this指针的shared_ptr对象。如下所示:

                                                                      3)请勿直接使用shared_ptr互相循环引用,如实在需要请将任意一方改为weak_ptr。

                                                                        代码运行结果,没有看到打印任何内容,析构函数没有被调用。最终你我都没有jump,完美的结局。但是现实就是这么残酷,C++的世界不允许他们不jump,需要将其中一个shared_ptr改为weak_ptr后资源才能正常释放。

                                                                          4)优先使用make_shared而非直接构造shared_ptr。make_shared主要有以下几个优点:

                                                                          a、可以使用auto自动类型推导。

                                                                          shared_ptr<Object> sp(new Object());

                                                                          auto sp = make_shared<Object>();

                                                                          b、减少内存管理器调用次数。shared_ptr的内存结构如下图所示,包含了两个指针:一个指向其所指的对象,一个指向控制块内存。

                                                                            这条语句会调用两次内存管理器,一次用于创建Object对象,一次用于创建控制块。如果使用make_shared会一次性分配内存同时保存Object和控制块。

                                                                            c、防止内存泄漏。

                                                                              这段代码可能发生内存泄漏。一般情况下,这段代码的调用顺序如下:

                                                                              new Handler() ① 在堆上创建Handler对象

                                                                              shared_ptr() ②创建shared_ptr

                                                                              getData() ③调用getData()函数

                                                                              但是编译器可能不按照上述①②③的顺序来生成调用代码。可能产生①③②的顺序,此时如果③getData()产生异常,而new Handler对象指针还没有托管到shared_ptr中,于是内存泄漏发生。使用make_shared可以避免这个问题。

                                                                                这条语句在运行期,make_shared和getData肯定有一个会先调用。如果make_shared先调用,在getData被调用前动态分配的Hander对象已经被安全的存储在返回的shared_ptr对象中,接着即使getData产生了异常shared_ptr析构函数也能正常释放Handler指针对象。如果getData先调用并产生了异常,make_shared则不会被调用。

                                                                                但是make_shared并不是万能的,如不能指定自定义删除器,此时可以先创建shared_ptr对象再传递到函数中。

                                                                                  6.3 std::unique_ptr

                                                                                  std::unique_ptr是独占型智能指针,仅支持移动语义,不支持复制。默认情况下,unique_ptr有着几乎和裸指针一样的内存开销和指令开销,可以替代使用裸指针低开销的场景。

                                                                                  1)与shared_ptr不同,unique_ptr可以直接指向一个数组,因为unique_ptr对T[]类型进行了特化。如果shared_ptr指向一个数组,需要显示指定删除器。

                                                                                    2)与shared_ptr不同,unique_ptr指定删除器时需要显示指定删除器的类型。

                                                                                      7 lambda表达式

                                                                                      1)捕获了变量的lambda表达式无法转换为函数指针。

                                                                                        2)对于按值捕获的变量,其值在捕获的时候就已经确定了(被复制到lambda闭包中)。而对于按引用捕获的变量,其传递的值等于lamdba调用时的值。

                                                                                          3)默认情况下,lambda无法修改按值捕获的变量。如果需要修改,需要使用mutable显示修饰。这其实也好理解,lambda会被编译器转换成operator() const的函数对象。

                                                                                            4)lambda无法捕捉静态存储的变量。

                                                                                              如何自学C++?

                                                                                              作为一个有20多年c++自学经验的老工程师,很愿意分享自己的学习历程。

                                                                                              在这个各种快速开发语言层出不穷、各种技术栈粉墨登场的时代里,还愿意自学C++,我首先假设你是一个富有钻研精神的人、对操作系统底层架构技术充满好奇、愿意为自己的作品呕心沥血、孜孜以求的人,如果是,那么请和我一起踏上c++自学之旅。

                                                                                              首先,需要有比较好的微机原理基础。记得我当时学c++的时候,我们在课堂上已经学习过了51机单片机原理,自己可以动手组装单片机,手动翻译机器码并输入到ROM中,这些基础对于理解C++的内存操作、CPU的指令、IO操作等都非常有帮助。所以如果有可能,可以先学习《微机原理与接口技术》,对硬件部分有基本的了解。这样才好理解C++对于底层接口的操作。

                                                                                              其次,养成良好的编码习惯。熟读Google 的《google c++ style guide 》是我对每一个新入职的同事要求做的第一件事情。在这份指南里,不但告诉了你怎么做,还告诉了你为什么这么做。

                                                                                              然后,要掌握基本的算法基础,多练习用C++实现经典的算法。

                                                                                              最后,多上github,阅读经典的开源代码。

                                                                                              如何自学C++?

                                                                                              作为一个过来人并且在某大互联网公司使用C++多年的从业者来说,还是需要好好的说一下,从学生时代开始吧。

                                                                                              作为计算机专业学生,刚开始大多时间都在练基本功,c语言以及各种数据结构在此基础上各种算法,当时不理解后来发现这太弥足珍贵了。后来开始学习C++,说实话内容太多很多不用就忘记了,学生时代喜欢看的见的东西,去学习visual c++,惨痛的经历,后来直接放弃了,能够静下心来去读经典的c++著作,慢慢的就发现了新的乐趣而不能自拔,这个读书过程一直持续到研究生毕业。

                                                                                              1.作为入门书籍《C++ Primer》和《c++程序设计语言》,这两本书二选一,这是非常经典的书,这是必须要完成n遍的,其他所谓的诸如此类《×××天学会xxx》的书直接放弃吧,每次重新读的时候都会有这种感觉:原来书籍有说到这个东西啊。如果有想快速入门的可以看看《Essential C ++》这本书是primer的精简版。

                                                                                              2.进阶之路:effective系列:effective c++ /more effective c++/effective stl

                                                                                              exceptional 系列:exceptional c++/more effective c++

                                                                                              effective非常经典,读完受益匪浅,Google编码规范很多出自这里。

                                                                                              3.到这里要特别强调一定要读Google C++ 编码规范:【Google C++ Style Guide】https://google.github.io/styleguide/cppguide.html,这个要读n遍并且在实际编码过程中要严格实践,这是工作之后觉得最有意义的事情,在B公司工作不符合编码规范连代码都不好意思发起code review,也不允许提交不符合编码规范的代码,当然b家的编码规范跟Google出入的很少很少。

                                                                                              4.继续深入:《深度探索c++对象模型》这本书作者跟primer是一个人,深入研究一下内存对象布局。

                                                                                              5.模板和stl

                                                                                              c++ templates/stl源码剖析

                                                                                              熟悉模板编程和常用stl容器内存实现以及适配器实现和常用标准库算法

                                                                                              6.工具书:c++程序设计语言/c++标准库

                                                                                              7.gcc/g++相关

                                                                                              最后关于C++1x,这给学习C++带来了很大的学习成本,要新旧都要兼顾,建议先学习不涉及c++1x的内容,再切换到学习新的C++1x,新的c++也演进中,从11到14到17,已经发布了三版标准,内容也不断在扩,扩的有点多,有的也删掉了,现在处于c++20标准周期,很多经典书籍也跟着翻新,所以要跟上啊

                                                                                              最后,多读别人源码多多自己实践,这是最快的漫长捷径,加油吧

                                                                                              如何自学C++?

                                                                                              先学基本语法,不要死记硬背,然后学着编码,就写在main函数中;

                                                                                              学会调试,记住一点,任何程序都是调试或测试出来的,只要是稍大的项目都是,那些用print输出调试,那只是在搞笑。

                                                                                              学会函数调用,类调用,跨文件调用(如:外部变量)

                                                                                              再次学习基本的,如变量种类,变量所占字长,在内存中排列。

                                                                                              指针,不要怕他,但要敬畏,敢用,但一定要知道他指向谁,初学者一定不要随意改变指针地址,可以改变值,对new出来的,知道在什么地方delete,delete后记得赋值null,记得野指针。

                                                                                              熟练使用stl,不会写,但要知道原理,在哪种情况下用那种容器与对应算法。

                                                                                              到玩在可以学些设计模式,学这个我自己有三层感悟:看山似山,看水似水;看山不是山,看水不是水;看山还是山,看水还是水;做过几个项目后,自己感触,以前是为了设计模式而设计模式;

                                                                                              这个时候应该学了快一年了,慢的话是两年,算是入门了。

                                                                                              可以进行一些模块设计,性能优化,重购,这个学习需要在项目中学习,然后看些网络,内存池,线程池,并行,数据库方面的,需要2-5年。

                                                                                              建议:

                                                                                              买书,纸质方面的,看电子版,手中无一本纸质书的,我没见过,都有书在手,好书看多遍;那种21天的书飘过,害人不浅。

                                                                                              多学习基本的,十年后就明白,程序最后用的是那些基本的东西;

                                                                                              指针一定要学好,如果这门语言是九阳真经的话,那指针就是九阳真经最后也是最难练的;

                                                                                              学好c++,学其他中高级语言,一般是3-7天可上手做软件了。

                                                                                              记得学会调试。

                                                                                              最好找一个高手带,可以缩短大半时间。

                                                                                              如何自学C++?

                                                                                              先找个好课程看看,最好视频教程,从0-1 用思维导图整理笔记。c++我也在使用 有问题找我也行

                                                                                              如何自学C++?

                                                                                              1、有c语言基础吗?如果没有,建议从谭浩强的c语言这本书开始,基本的语法、指针这些要会,学完这个,可以自己写写demo,或者实现一些函数(如strcpy, strnlen等,面试常考),或者c++的stl里的一些类(如string,vector等)来检验自己是否真的会了。


                                                                                              2、然后看《C++ Primer Plus(第6版 中文版)》,这本很经典,一版再版了,内容比较详实,边学边写demo(一定要上电脑测试程序,测试的时候学习下gdb调试程序)。


                                                                                              学完上面2个,你就基本入门c++了。剩下的就是提高和加深理解了(看优秀源码,跟项目做)


                                                                                              3、程序=数据结构+算法,会了语言,一般要熟悉些基础的数据结果和算法知识《数据结构(C语言版)清华大学计算机系列教材》


                                                                                              4、c++进阶需要看的书籍:

                                                                                              《Effective C++:改善程序与设计的55个具体做法》

                                                                                              《深度探索C++对象模型》

                                                                                              《More Effective C++:35个改善编程与设计的有效方法(中文版)》

                                                                                              如何自学C++?

                                                                                              学习C++,为什么有很多C++大牛,有各自不同的学习方式,这个人这么学,代码这么写,那个人那么学,代码那样写,到底谁的正确的?我告诉你:没有谁对谁错,因为他们的工作、学习、方向、环境造就了他们的学习方式。

                                                                                              很多刚出道的,慕名来学C++,但我想说一句,假如你想学C++,请拿出你的巨大的毅力和精力来学,不做好这种准备,不建议学习并精通C++。

                                                                                              这里只说C++,不涉及操作系统、计算机原理、网络通信、加密解密等其它计算机学科的知识,虽然他们是相辅相成的,但是我尽量不涉及这些知识。当你学完之后,你或许可以重新学一遍我上面所提的一些学科知识。当然,你不需要太过深入,把你大学里面的学会了理解了就可以了。

                                                                                              那么下面重点说说,如何学习C++:

                                                                                              当然首先无外乎重要的一点,一本C++语法方面的书,从头到尾看一遍,看的过程,多敲样例代码,书后习题一定要做,具体重点看那些了,我建议,看到类那里,把继承看完,全部弄懂基本就可以了。一定要多敲代码,多动手,一定要弄懂指针,不懂的话后面学习让你如坠云里雾里,所以指针一定要直到弄懂为止。

                                                                                              学习完以后,你的C++基本功底差不多了,那么如何巩固和提高你的基本功了,这个时候,你要重点专研C++的多态,虚函数、虚基类等一些容易搞混的东西,这些东西,你几个月不用,基本上就忘的差不多了。小编推荐一个学C/C++的学习裙【六二七,零一二,四六四】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有很多干货和技术分享!但是为什么搞懂还这么重要,因为后来你需要学的时候,或者你看到其他需要这些基础知识的时候,你会比别人更容易来学习这些东西。

                                                                                              然后,你需要学习模板的知识,模板函数、模板类,为下一个阶段学习做准备。

                                                                                              学习完上面之后,这个时候,你要开始学习STL,这个可以算是进阶了。当然,学习STL之前,你必须要有一点点数据结构的知识,假设你大学考试数据结构考试不是抄的过了,你就可以开始学习STL了,你需要弄懂vector、queue、deque、priority-queue、list、stack、map、set、multiset、multimap等,需要了解迭代器、算法、容器的概念以及使用方法。学习到什么程度就可以了呢,这个不好说,得看各人,自己把握。

                                                                                              然后,学习数据结构吧。用C++实现你大学数据结构课本上所有的知识点(栈、队列、树、图、查找排序算法等),当然,实现完之后,你需要将这些实现的代码记录下来,以备以后工作应聘等不时之需。

                                                                                              以上学完了,下一阶段该怎么学了,这个阶段很重要,是衔接理论与现实应用的衔接点,很多时候,C++如果不借助于其它方面的一些已经写好的库,一些很简单的任务C++都完成不了,比如说让你写一个windows的窗口应用程序,你用C++,就实现不了。因为C++的标准库,没有与GUI相关的东西,这个时候,我们需要借助于其他的一些库,比如,MFC,QT的库等,在这一个阶段,你需要学习如何使用IDE平台库或者系统平台的库,利用各种已经写好了现成的库,你只需要调用,就可以完成非常强大功能。这个时候,如果你挺聪明的,你或许可以用C++来写一些小游戏了,比如俄罗斯方块、贪食蛇等。

                                                                                              平台库我们用完了,但我们不局限于IDE或者系统函数库的调用与使用,我们要使用除此之外的其它第三方库,比如网络游戏那超级酷的3D效果,这个时候,比如opencv、PCL、opengl、directX等,具体怎么学,看你的工作学习所需了。

                                                                                              直到现在,我们一直从语言层面上来学习C++,这一次,我们要从俯瞰的角度来审视C++,我们要学习C++的开发模式,建议大家学习一下C++的开发方法,开发模式,二十几种的设计模式。

                                                                                              到了现在为止,你需要温故而知新,因为你前面很多细节都忘了。你可以报考一门中级软件工程师考试,用来让你的编程与所有学科的知识进行有效的糅合,系统化的学习计算机知识,让你对C++的理解和计算机的理解相辅相成,齐头并进。

                                                                                              学习完上面之后,C++我觉得你基本上算中上等水平了,可能很多的C++使用的人都停留在这个水平。不出意外,这个时候,你已经学会用C++走路了,以后的路,需要你自己走了,以后的进阶,你需要选择一个方向,比如通信、二维三维图像、3D大型网络游戏里面的某个重要的C++分支开发等(基本上是公司和你自己的定位来帮你选择方向),这个时候,需要的,大多是算法、算法优化等,我们发现C++的学习方式,就是先广度后深度。

                                                                                              C/C++ linux服务器开发免费学习地址:https://ke.qq.com/course/417774?flowToken=1013300

                                                                                              如何自学C++?

                                                                                              初学者最好先把谭浩强的c语言看一遍,然后在上网找一下c++视频看一下,最后再看一遍c++ primer plus 这本书

                                                                                              如何自学C++?

                                                                                              编程编程,主要在编,你要多写,多上机,多思考,掌握好语言基础,然后学下数据结构,其实学c++前,倒是可以先学c,因为c++可以认为是c的超集,你先掌握了c,再入手c++就会顺一些

                                                                                              如何自学C++?

                                                                                              谢谢邀请:看到这个题目,心里有些小激动和亲切感。现在如何自学C++,我不知道什么方式最好,只能向您介绍1990年代自学C++的过程。

                                                                                              那时,使用的电脑是386机型,DOS操作系统。当时有人说:如果不会使用电脑,将会成为新世纪的文盲。添置了电脑之后,才知道必须安装应用软件才能发挥作用,而且安装什么软件它才会干什么工作。把电脑叫成“通用机器”是实至名归。

                                                                                              一、学习C++的初衷是“需要”,因为那时没有针对自己从事行业的专用软件,通用软件的专业性能达不到专业要求。

                                                                                              二、初次接触C语言编程是:Turbo C2.0。安装了编译器后买了教材和函数手册后就上阵了。现在回想起来,DOS下的C语言编程很简单。main(){}。就是一段程序,在里面加上for(;;){};if(){}else{};或switch(){case:break;default:break;},然后,调用C函数就能随心所欲遍程了。其他的C语言知识是编译器的规定,不同的编译器是不一样的,您只要知道有哪些规定?功用是啥?如何使用就行了。因为是需要前提下的自学编程,需要的知识就接受的快,不需要的知识根本不要管它。又不是报考程序员级别,包袱越少越好。

                                                                                              三、学习编程上了瘾,比玩电脑游戏要有意思的多。时间久了对一些软件,只要看它的性能就能隐隐约约的感到程序员的思路和使用的数据模型。

                                                                                              四、从Torbo到VSC++是一个很大很大的台阶,它们虽然基础是一样的,程序的数据模型和数据关系的建立也有不少共性,但是编程操作根本不是一个理念。因此说,现在学习C++如何起步最轻松便捷,我不知道,建议向同龄人请教。

                                                                                              五、不怕您笑话,我从未想过要参加程序员级别的考试,就像我已经对那个高级别的摄影协会会员的名头不屑一顾一样。自由自在的玩自己想玩的,已经让我非常感恩我所处的这个伟大的时代了。

                                                                                              如何自学C++?

                                                                                              作为C语言课程的老师,我也来凑个数吧。在实际教学过程中,有不少同学觉得C语言学习比较困难,就我的理解,主要有两点原因。

                                                                                              第一,C语言的语法知识太多、太琐碎;第二,反复地做算法类的编程练习,不感兴趣,不愿写程序,进而觉得入门困难。分析了上面的原因后,我们采取了对应的策略:

                                                                                              首先,入门时仅讲最少需要的语法知识,一些额外的语法知识先不要学。比如++、--、复合赋值运算符、逗号运算符、switch-case语句、do-while语句等。实际上不学这些语法,也可以写出完整的程序。

                                                                                              其次,足够的编程量是必须的,可以充分利用在线OJ系统,会给你一个正反馈,并在初始学习编程时养成严谨的习惯。

                                                                                              再次,为了培养同学们对编程的兴趣,我们采用了通过游戏开发来教编程的方式,可以参考:知乎专栏 。同时,C语言中的相应语法知识,如函数、数组、指针、文件等,都是在开发游戏的实践中,遇到问题,学习相应语法知识后解决问题,从而得到更深的理解和体会。

                                                                                              最后,有条件的话,还是和同学一起学习,这样可以互相交流、督促。后面开发较大的游戏练习时,可以进行有效的团队合作。

                                                                                              如何自学C++?

                                                                                              首先,可以找一本稍微薄一点的书入门,经典的有《Essential C++》。掌握基本的语法和概念,对C++有一个初步的认识。然后,就可以看《C++ Primer》了。这本书强烈推荐。这本书有点厚,需要耐心。一定要认真读完,并且尽量实现一些例子,自己动手去写,去debug。这本书吃透C++的基础基本掌握了。编写常用的程序不是问题。接下来可以进阶了。面向对象程序设计,侯捷翻译的《深度探索C++对象模型》必读,这本书讲的是底层编译器C++面向对象 的实现原理,继承、虚函数等等的机制。这本书比较有难度,个人认为需要至少读2遍。然后是《Effective C++》,讲了55条准则,提高C++编程质量的。如果有一定的C++开发经验,读起来更有感触。关于泛型编程,可以先读《C++标准程序库》,对STL有个基本认识,学会使用,然后可以去研究stl源码,侯捷的《STL源码剖析》值得推荐。源码面前,了无秘密。阅读经典源码往往能获得很大的收获。如果有精力,可以再学学boost库,号称准标准。

                                                                                              如何自学C++?

                                                                                              其实还要每天坚持,不管是看看书还是每天抽出一致两个小时学习一下,会有很大帮助。给你分享个免费学习的网站,里面视频清晰录制讲解

                                                                                              以下十套热门教程 视频全讲解,专业丰富,适合零基础和所有兴趣爱好者,视频内容完全免费,点开链接后到课程目录双击视频即可观看

                                                                                              1、[C语言基础入门教程视频]

                                                                                              http://www.hqyj.com/xuexi/CourseVideo/Ccontrol.html?s=47236

                                                                                              2、[C++语言课程视频教程]

                                                                                              http://www.hqyj.com/xuexi/CourseVideo/Cbiancheng.html?s=47236

                                                                                              3、[ARM开发技术视频教程]

                                                                                              http://www.hqyj.com/xuexi/CourseVideo/Acontrol.html?s=47236

                                                                                              如何自学C++?

                                                                                              先推荐一本书《C++大学教程》,这是一本国外教材,通俗易懂,内容全面,值得拥有。

                                                                                              为啥推荐这个呢,作为一个C++程序员,我来说一下自己的感受。本科的时候学过C++但是上课讲得真的很浅,很多C++的高级特性,比如虚函数,模板类,模板库等等都没有涉及,于是想深入学习一下。

                                                                                              开始听说《C++primer》很牛逼,于是就买了啃了一遍,但是读完一遍之后发现很多细节还是理解不了,不是说这本书不好,我感觉是因为积累太浅,直接看很多特性真的很难接受,无意中发现了推荐的这本书,发现大部分特性这里面都提到了,而且讲得很易懂,给我印象最深的就是虚函数。读完这本之后又尝试把《C++primer》啃了一遍发现就好多了。

                                                                                              至于面试中问到的很多C++问题,强烈推荐《effective C++》系列丛书以及《深入剖析C++模板库源码》会让你对这个语言的神秘性更深一层。

                                                                                              后来因为工作内容需要,读了很多深度学习框架的源码,这时候对C++11之后的新特性,以及模板类又有了一些新的认识。

                                                                                              总结下来,多读书,多读源码,多动手确实不失为一种良好的学习方法。读书可以让你对这些特性有一个系统性的学习,读源码可以学习别人的使用技巧,加深对某些特性的理解,多动手就不多说了,都懂得

                                                                                              如何自学C++?

                                                                                              从360软件管家里面下载C++软件,然后去网上找教程,对照着学习。

                                                                                              如何自学C++?

                                                                                              1.先看一些c++的入门教程,比如thinkc++等;

                                                                                              2.去github上面下载一些开源的项目学习;

                                                                                              3.主要还要有持之以恒的学习心态.

                                                                                              如何自学C++?

                                                                                              下面的是学C++时要注意的。r

                                                                                              1.把C++当成一门新的语言学习(和C没啥关系!真的。);r

                                                                                              2.看《Thinking In C++》,不要看《C++编程思想》;r

                                                                                              3.看《The C++ Programming Language》和《Inside The C++ Objectr

                                                                                              Model》,不要因为他们很难而我们自己是初学者所以就不看;r

                                                                                              4.不要被VC、BCB、BC、MC、TC等词汇所迷惑——他们都是集成开发环境,而我们要学的是一门语言;

                                                                                              5..不要放过任何一个看上去很简单的小编程问题——他们往往并不那么简单,或者可以引伸出很多知识点;

                                                                                              6.会用Visual C++,并不说明你会C++;

                                                                                              7.学class并不难,template、STL、genericprogramming也不过如此——难的是长期坚持实践和不遗余力的博览群书;

                                                                                              8.如果不是天才的话,想学编程就不要想玩游戏——你以为你做到了,其实你的C++水平并没有和你通关的能力一起变高——其实可以时刻记住:学C++是为了编游戏的;

                                                                                              9.看Visual C++的书,是学不了C++语言的;

                                                                                              10.浮躁的人容易说:XX语言不行了,应该学YY;——是你自己不行了吧!?

                                                                                              11.浮躁的人容易问:我到底该学什么;——别问,学就对了;

                                                                                              12.浮躁的人容易问:XX有钱途吗;——建议你去抢银行;

                                                                                              13.浮躁的人容易说:我要中文版!我英文不行!——不行?学呀!

                                                                                              14.浮躁的人容易问:XX和YY哪个好;——告诉你吧,都好——只要你学就行;

                                                                                              15.浮躁的人分两种:a)只观望而不学的人;b)只学而不坚持的人;

                                                                                              16.把时髦的技术挂在嘴边,还不如把过时的技术记在心里;

                                                                                              17.C++不仅仅是支持面向对象的程序设计语言;

                                                                                              18.学习编程最好的方法之一就是阅读源代码;

                                                                                              19.在任何时刻都不要认为自己手中的书已经足够了;

                                                                                              20.请阅读《The Standard C++ Bible》(中文版:标准C++宝典),掌握C++标准;

                                                                                              21.看得懂的书,请仔细看;看不懂的书,请硬着头皮看;

                                                                                              22.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍;

                                                                                              23.请看《Effective C++》和《More Effective C++》以及《Exceptional C++》;

                                                                                              24.不要停留在集成开发环境的摇篮上,要学会控制集成开发环境,还要学会用命令行方式处理程序;25.和别人一起讨论有意义的C++知识点,而不是争吵XX行不行或者YY与ZZ哪个好;

                                                                                              26.请看《程序设计实践》,并严格的按照其要求去做;

                                                                                              27.不要因为C和C++中有一些语法和关键字看上去相同,就认为它们的意义和作用完全一样;

                                                                                              28.C++绝不是所谓的C的“扩充”——如果C++一开始就起名叫Z语言,你一定不会把C和Z语言联系得那么紧密;

                                                                                              29.请不要认为学过XX语言再改学C++会有什么问题——你只不过又在学一门全新的语言而已;

                                                                                              30.读完了《Inside The C++ Object Model》以后再来认定自己是不是已经学会了C++;

                                                                                              31.学习编程的秘诀是:编程,编程,再编程;

                                                                                              32.请留意下列书籍:《C++面向对象高效编程(C++ Effective Object-Oriented Software Construction)》《面向对象软件构造(Object-Oriented Software Construction)》《设计模式(Design Patterns)》《The Art of Computer Programming》;

                                                                                              33.记住:面向对象技术不只是C++专有的;

                                                                                              34.请把书上的程序例子亲手输入到电脑上实践,即使配套光盘中有源代码;

                                                                                              35.把在书中看到的有意义的例子扩充;

                                                                                              36.请重视C++中的异常处理技术,并将其切实的运用到自己的程序中;

                                                                                              37.经常回顾自己以前写过的程序,并尝试重写,把自己学到的新知识运用进去;

                                                                                              38.不要漏掉书中任何一个练习题——请全部做完并记录下解题思路;

                                                                                              39.C++语言和C++的集成开发环境要同时学习和掌握;

                                                                                              40.既然决定了学C++,就请坚持学下去,因为学习程序设计语言的目的是掌握程序设计技术,而程序设计技术是跨语言的;

                                                                                              41.就让C++语言的各种平台和开发环境去激烈的竞争吧,我们要以学习C++语言本身为主;

                                                                                              42.当你写C++程序写到一半却发现自己用的方法很拙劣时,请不要马上停手;请尽快将余下的部分粗略的完成以保证这个设计的完整性,然后分析自己的错误并重新设计和编写(参见43);

                                                                                              43.别心急,设计C++的class确实不容易;自己程序中的class和自己的class设计水平是在不断的编程实践中完善和发展的;

                                                                                              44.决不要因为程序“很小”就不遵循某些你不熟练的规则——好习惯是培养出来的,而不是一次记住的;

                                                                                              45.每学到一个C++难点的时候,尝试着对别人讲解这个知识点并让他理解——你能讲清楚才说明你真的理解了;

                                                                                              46.记录下在和别人交流时发现的自己忽视或不理解的知识点;

                                                                                              47.请不断地对自己写的程序提出更高的要求,哪怕你的程序版本号会变成Version 100.XX;

                                                                                              48.保存好你写过的所有的程序——那是你最好的积累之一;

                                                                                              49.请不要做浮躁的人;

                                                                                              50.请热爱C++!补充:对c++学习的一点感想,希望对初学者能有些帮助1.如果你以前从来没有接触过c++,那么选择的第一本c++教程就显得尤为重要,我认为你可以参照以下的标准进行选择:a.对标准c++进行讲解,毕竟c++比从前发生了很大的变化。b.要求全面,但不要很深,这要有助于你对于c++有一个全面的认识,打好基础,并且易懂的教材还能加快学习的进度,让自己保持一种成就感。c.要有完整的范例来讲解每一个知识点如何运用,请注意这里所说的完整,并不是一个个代码片断。因为由于你以前从未接触过用c++进行编程,完整的代码可以使你有一个整体的概念,并且能够很快去进行大量的实践,因为变编程是从模仿开始,完整的代码恰恰告诉你了一个完整的步骤。不必自己去揣测。d.推荐:《c++ primer plus》2.当你有了一定的基础以后,就要选择一些书来迅速提高自己。这类书的特点是不仅仅教你如何去运用,而且要叫你如何去思考,并且你读起来也不是那么轻松。它意味深远,并不是你读一遍就能掌握的。推荐:《thinking in c++》《effective c++》《more effective c++》《c++ programming language》...《c++ 沉思录》3.接下来就是对第二步所介绍的书籍进行反复的阅读,并且进行实践。由于这些书一位深远,每个人基于自己的基础都会有不同的收获,例如如果你的基础还没有达到某一高度,那么你就对一些精深的技术视而不见,不信?你可以试试,看看当自己有了一定提高之后再来读从前的一本书,你会发现许多新的东西

                                                                                              如何自学C++?

                                                                                              多刷题,我女儿小学四年级开始学的,稀里糊涂刷了很多题,也不知其中的道理,只知道套公式,还不会融化贯通。为了教女儿我也学了点,发现这个东西只能靠刷题来增强思路,增加手感,只有各种题都熟悉了,才会更好的掌握这种需要。

                                                                                              如下c语言:

                                                                                              class Intcell

                                                                                              {

                                                                                              public:

                                                                                              Intcell( )

                                                                                              { storedvalue = 0; }

                                                                                              Intcell(int init){storedvalue=init;}

                                                                                              void write(int x){storedvalue=x;}

                                                                                              int read(){return storedvalue;}

                                                                                              private:

                                                                                              int storedvalue;

                                                                                              };

                                                                                              输入到软件里,得出结果


                                                                                              如何自学C++?

                                                                                              所有编程语言都要从Hello world开始的

                                                                                              1、要多思考,可以帮助自己写代码过程中思路更清晰

                                                                                              2、提高自己的代码量,都知道量变到质变的过程

                                                                                              3、最后还要注重阅读别人优质源代码,这样自己写的代码也更规范,写代码的思路也更开阔


                                                                                              希望我的回答能够帮助到你,望你快速融入环境


                                                                                              关注讨论相关技术哈!

                                                                                              如何自学C++?

                                                                                              学习C++的话,并不一定要学C的,因为C++和C其实是2种语言,只是C++对C兼容而已, 我们不应该把C++跟C牵连在一起了.学C++就要把它当一门新语言来学.我说一下从完全不懂到最后高手的专家推荐路线吧:1. 《C++ Primer》Lippman写的,经典中的经典,C++入门的宝典,读完这本书,基本语法过关,部分技巧掌握。2.《The C++ programming language》C++的创始人Bjarne Stroustrup写的,这本书的权威性毋庸置疑,而且这里面讲到了一些比较底层的东西,如果你看过了《C++ Primer》的话,这本书可以跳着看,懂的就跳过。3.《Effective C++》 Scott Meyers顶级大师用活泼幽默的语言写的书,这本书中讲到了许多应该注意的问题,这是十分值得购买的书。(Lippman曾把程序员分为看过effective c++的和没看过的两类。由此可见此书的重要性)4.《More Effective C++》上书的姊妹篇,这本书里讲到了许多关键性的技术,对提高程序的效率是非常有帮助的。5.《Advanced C++》这是一本神奇的书,里面讲到了许多连C++设计者都没想到的妙法,解决了许多看似不可能解决的问题。Scott Meyers曾隆重推荐过的书。6.《Inside the C++ Objects Model》又是Lippman的大作!这本书讲到了他在开发第一个C++编译器时的许多想法,彻底解析了C++底层机制是如何实现对象模型的,看过这本书,你对C++的了解会有质的飞跃!从这刻起,你有权力说你是一个C++程序员了!光学C++语言基本上看完上述的书就是高手了,其他经验要在实践中累积,你在看这些书的同时就应该多做一些小程序,小项目,提高水平的速度是飞快的.这是我个人的经验。另外,你学了C++还要开发程序,开发软件,无疑要使用MFC之类的东西 《API Programming》和《MFC Windows 程序设计》两书值得一看。这两本书能迅速提高你的实践水平。 最后,不要被这么多书吓倒,用起心来,很快能搞定!祝你早日成功!!无论入门还是提升自己真心不建议国内的书~这个不是书写得好不,而是思路真没有国外的书哪样开阔、灵活,而且更新较慢,像现在国外早有C++11标准的书了,但国内还是鲜有的。最后,如果《C++ Primer》啃不动,那试试《C++ Primer plus》中文版或《Essential+C++》入门级中文版

                                                                                              留言与评论(共有 0 条评论)
                                                                                                 
                                                                                              验证码:
                                                                                              Top