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<class T1,typename T2>
class MyClass
{
public:MyClass(T1& a ,T2& b):a_(a),b_(b){} ;T1& Func1();void Func2(T2& x);
private:T1 a_;T2 b_ ;
};template<class T1,typename T2>
T1& MyClass<T1,T2>::Func1()
{T1 temp = this->a_ ;return &temp ;
}template<class T1,typename T2>
void MyClass<T1,T2>::Func2(T2& x)
{this->b_ = x ;
}

如果大家对C/C++感兴趣的话,可以加一下我们的学习交流Q群:637  935  295,免费领取一套学习资料和视频课程哟~

STL

C++的泛型本来就是为了STL而推出的,STL(标准莫板块) 包含常用数据结构(如链表、可变长数组、排序二叉树)和算法(如排序、查找)的模板。它是一个十分强大且实用的库。

STL中容器即实现在类模板的基础上。算法如排序、查找等算法是实现在函数模板的基础上。

C++STL容器分顺序容器和关联容器。顺序容器包括:可变长动态数组 vector、双端队列 deque、双向链表 list。它们的元素与位置顺序有关,与元素大小无关。关联容器包括:set、multiset、map、multimap。关联容器内的元素是排序的,元素的顺序直接关联元素本身,没有物理顺序。

任何容器都自带迭代器函数,他们是:

begin():返回指向容器中第一个元素的迭代器。

end():返回指向容器中最后一个元素后面的位置的迭代器。

rbegin():返回指向容器中最后一个元素的反向迭代器。

rend():返回指向容器中第一个元素前面的位置的反向迭代器。

C++:听说C++很难学?该怎么学习C++?相关推荐

  1. 少儿编程c语言 难度,c语言很难学吗

    C语言是一种面向过程的编程语言,它已经从计算机硬件中分离出来,可以设计中等规模的程序.接下来给大家讲讲c语言很难学吗,希望对你们有帮助. C语言编程,除了让你知道相关的概念,带你进入编程大门,也让你了 ...

  2. 计算机临床医学自动化哪个好,这五个专业待遇高,就业好,但是很难学,挂科风险大,选择要慎重...

    原标题:这五个专业待遇高,就业好,但是很难学,挂科风险大,选择要慎重 ​每年高考后都有无数学生纠结报志愿选择哪个专业,专业一般划分为红牌专业和绿牌专业.所谓的红牌专业就是那些失业量较大,就业率.薪资和 ...

  3. 女生学计算机真的难吗,女生想学计算机科学与技术,怕很难学懂,这门学科是不是特别难?女生学到底好不好?...

    女生想学计算机科学与技术,怕很难学懂,这门学科是不是特别难?女生学到底好不好?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下 ...

  4. 3D建模靠自学很难学成功吗?

    很多打算学习3D建模的同学刚开始学的时候,总是信誓旦旦的说:我要自学,我一定可以自学成功.然后一般半年以后再见,同学3D建模自学得怎么样了啊?基本上大多数同学都会回答:哎,老师别提了,学废了,老不好意 ...

  5. 听说大数据工资很高,是不是很难学?

    大数据技术就是将庞大的数据信息进行专业化处理.通过"加工"实现数据的"增值". 目前大数据行业异常火爆,不少人都对大数据充满了兴趣,其中有大部分人都是之前没有接 ...

  6. FPGA真的很难学吗?那可能是没弄明白这些道理

    问:零基础,想学FPGA,应该从哪入手?应该看什么教程?应该用什么学习板和开发板?看什么书等? 如果想速成,那就上网看视频吧,这样主要是面对应用的,一个小时内让你的板子运行起来.早期起来的快,活学活用 ...

  7. 【转】FPGA真的很难学详细解答

    如果想速成,那就上网看视频吧,这样主要是面对应用的,一个小时内让你的板子运行起来.早期起来的快,活学活用,就是后期没有系统理论支持,会有些吃力,特别是大项目,那完全是个悲剧.国内做的可以的,周立功算一 ...

  8. python学起来难不难-python很难学?学起来很吃力,想放弃?看别人是怎样学习的...

    其实吧, 你也没不能接受别人一分钟能赚你一辈子的钱吧- 比尔盖茨动动手指就有一套房子,你不是也没觉得有什么不对吗? 那你为什么不能接受有人一分钟能学你一辈子的知识- 别人用一分钟学你一个小时的事情,不 ...

  9. 本以为java语言很难学,其实就学完下面这些知识,就能理解了

    刚毕业,找工作,很多人都面临相同的问题.自己能做什么?什么工作既舒服,福利又好(不存在的,除非银行你家开的).然后社会是个发展的社会,现代人的生活越来越智能,生活中其实充满"技术" ...

最新文章

  1. 设计模式实战 - 责任链模式
  2. putty 保存密码 自动登陆 四种方法
  3. www.yzcode.com Flash广告下载,自己利用从此网站下载的Flash广告制作了自己第一个广告...
  4. 新建网站与新建Asp.Net+Web+应用程序的区别
  5. 前端学习(2375):项目介绍结束
  6. linux系统监控必备两款软件
  7. oracle 去重_超详细的四类数据库去重实现方案汇总,值得收藏
  8. vue移动端下拉切换页面_详解vue移动端 下拉刷新
  9. 安卓最好的流量防火墙—Droidwall
  10. Unity3D加载资源的四种方式
  11. 【学习笔记】Unreal(虚幻)4引擎入门(四)
  12. tl-wr842n服务器未响应,TL-WR842N路由器怎么重启? 重启路由器的技巧
  13. 2011新版车主宝典改进亲体验(Android版)
  14. 一年级下册计算机教学计划,人教版一年级数学下册教学计划
  15. 日常生活收缩毛孔几个小妙招 - 生活至上,美容至尚!
  16. 夺命雷公狗---javascript NO:27 通过json调用12306查询车次信息
  17. C语言 “水仙花数”(包懂)
  18. STM32_BKP备份数据
  19. Android Study
  20. 决策树分类算法的案例(代码实现及运行测试)

热门文章

  1. 搞了这么久的产品,终于看清了真相
  2. 专题导读:大数据异构并行系统
  3. 【Python】Pandas在数据库中执行SQL语句并加载结果
  4. 【Python】Matplotlib绘制机器学习中的判别分析示意图
  5. 【Java】集合框架基础编程练习题
  6. 【Java】总结Integer类的API
  7. MapServer WinForm开发成功
  8. Swift class和struct的解归档
  9. 第二篇 Python图片处理模块PIL(pillow)
  10. ERP软件的追加开发环节存在特殊价值