找回密码
 立即注册
  • QQ空间
  • 回复
  • 收藏

C++这么难,该怎么学?

admin 2019-12-15 14:28 182人围观 C++相关



来源 :今日头条@编程老大叔

C++以其复杂的语法、指针、内存管理、泛型编程等特性难倒了一大批IT学子。小编以CSharp入门,中途转C++的时候痛苦过一段时间,不过随着业务能力的精进,已经逐渐爱上这门功能强大、灵活的语言了。
下面就分享一下学习经验

如何学习C++


关于如何学习C++,这个问题光嘴讲是没用的,还是需要自己动眼、动手、动脑。总结下来就无非这三个步骤:


学,不管是看书、看视频、还是参参加培训都可以,至少要系统化且持续性的去学习这门语言。个人建议如果有条件参加培训是最好的,如果没有可以看视频学习。但是不管是哪种方式,我都推荐大家一定要看书,跟着书本学习。不管你是培训还是看视频,思路都是跟着别人走的,只有看书才会有自己的理解,才更深刻。




抄,此处意为对着教程上的代码抄或者半key半抄,至少要将项目通过自己的手实现,并且能正常运行。这个过程是十分痛苦的。很多人可能在学知识的时候觉得自己都会,但是一到自己key的时候就捉襟见肘了,甚至对着抄debug时仍是一大堆错误,这段时间是怀疑人生的时间,一定要坚持、坚持、再坚持。比如最简单的helloword、文件读取、标准流输入输出等
    int main(){ printf("hello word") ; cout<<"hello word"; int a ; cin>>a}


    等熟练到一定程度,就需要自己是独立实现一个小功能或者开发一个小项目了,这中间一定会遇到很多问题,可以查资料、查教材、咨询其他人等。等你能独立实现自己想实现的功能的时候,那么恭喜你已经入门了,后面会越来越顺利。

    C++知识难点总结


    下面总结一些C++学习的难点

    指针


    关于指针已经讲过很多次了。理解指针你需要先理解计算机内存和内存地址概念,还有*和&运算符。
    比喻式理解:
    内存可以理解为土地,内存地址理解为土地编号,当我们的程序在创建变量和对象时,计算机会充当规划局的角色为变量和对象划分一块有编号的土地存放变量和对象,这就叫内存,而编号就叫内存地址。土地有使用期限(70年),期限后收回,计算机中变量和对象释放时也会释放内存被回收。
    指针:指针本身也是一个变量,类似int或者float类型,只不过int存放的是10、146等这样的整型数据,而指针变量存放的是内存的地址。
    *运算符:取内存地址上所存对象。
    &运算符:取对象所在内存的地址。
    指针指向:我们常说的某某指针指向谁,意思是,这个指针变量存放着那个对象在计算机内存中的地址。


    指针示意图

    泛型编程


    C++的泛型是基于模板实现的。不管是类模板或是函数模板,都不是真正的类或函数,只是一个编译器用来生成代码的蓝图。

    为什么需要泛型编程


    最简单的一个例子,假设你实现了一个链表的类,可以用来动态存储int型数据。但是现在又有一个需求是动态存储string类型的数据,这时候你怎么办呢?重新为存储string数据的链表单再实现一个类?这显然是不符合代码重用性原则的,这时候你可能会想到能不能将数据类型用参数的方式传进去。这就是C++泛型编程的由来;

    函数模板


    数据的类型也可以通过参数来传递,若在函数定义时可以不指明具体的数据类型,当发生函数调用时,编译器才根据传入的实参进行自动地推断数据类型,这样就实现了函数的模板。利用虚拟的类型来作为一个标识符来占位,等发生函数调用时再根据传入的实参来反向推断出真正的类型。
      void change(T& a,T& b){T temp = a;a = b ;b = temp ;}
      上面的代码实现了一个两个数交换的通用模板函数,T类型就是那个占位标识符。该模板实现了一个函数可以交换任意数据类型的两个参数。测试一下

        int a = 10,b = 20 ; change(a,b);cout<<a<<"|"<<b;string c = "i love u",d = "i love u too"; change(c,d);cout<<c<<"|"<<d;
        template<typename T>或template<class T>都可以,并且T类型参数可以有多个:template<typename T1, typename T2.....>

        类模板


        类模板中定义的类型参数可以用在类声明和类实现中。类模板的目的同样是将数据的类型参数化。

          template<classT1,typenameT2>classMyClass{public: MyClass(T1& a ,T2& b):a_(a),b_(b){} ;T1& Func1();voidFunc2(T2& x);private: T1 a_; T2 b_ ;};
          template<classT1,typenameT2>T1& MyClass<T1,T2>::Func1(){ T1 temp = this->a_ ;return &temp ;}
          template<classT1,typenameT2>voidMyClass<T1,T2>::Func2(T2& x){this->b_ = x ; }

          STL


          C++的泛型本来就是为了STL而推出的,STL(标准莫板块) 包含常用数据结构(如链表、可变长数组、排序二叉树)和算法(如排序、查找)的模板。它是一个十分强大且实用的库。
          STL中容器即实现在类模板的基础上。算法如排序、查找等算法是实现在函数模板的基础上。
          C++STL容器分顺序容器和关联容器。顺序容器包括:可变长动态数组 vector、双端队列 deque、双向链表 list。它们的元素与位置顺序有关,与元素大小无关。关联容器包括:set、multiset、map、multimap。关联容器内的元素是排序的,元素的顺序直接关联元素本身,没有物理顺序。
          任何容器都自带迭代器函数,他们是:
          begin():返回指向容器中第一个元素的迭代器。end():返回指向容器中最后一个元素后面的位置的迭代器。rbegin():返回指向容器中最后一个元素的反向迭代器。rend():返回指向容器中第一个元素前面的位置的反向迭代器。

          -END-


          推荐阅读
          【01】C++开发这一步必不可少:C++创建线程的方法【02】每个工程师都应该了解的一些 C++ 特性【03】“C/C++中char* 和 char「」区别【04】C++中是如何实现智能指针的?【05】现在市场上,C++ 主要用来做什么?


          免责声明:整理文章为传播相关技术,版权归原作者所有,如有侵权,请联系删除



          ----------------------------------------------------------------------------------------------------------------------
          我们尊重原创,也注重分享,文章来源于微信公众号:嵌入式ARM,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
          ----------------------------------------------------------------------------------------------------------------------

          鲜花

          握手

          雷人

          路过

          鸡蛋

          yafeilinux和他的朋友们微信公众号二维码

          微信公众号

          专注于Qt嵌入式Linux开发等。扫一扫立即关注。

          Qt开源社区官方QQ群二维码

          QQ交流群

          欢迎加入QQ群大家庭,一起讨论学习!

          我有话说......