根据InfoQ编程语言2月排行榜,统计发现,学习门槛最高的编程语言是C++。那么如何学好这门又难、门槛又高的语言呢?
前面我们介绍过C++。
C++是一种面向对象的计算机程序设计语言,由美国ATT贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现,最初它被称作“CwithClasses”(包含类的C语言)。它是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言,支持过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格.
C++是C语言的继承,进一步扩充和完善了C语言,成为一种面向对象的程序设计语言。
超实用性的Python零基础入门到进阶视频源码淘宝¥2购买已下架C++以其复杂的语法、指针、内存管理、泛型编程等特性难倒了一大批IT学子。小编以CSharp入门,中途转C++的时候痛苦过一段时间,不过随着业务能力的精进,已经逐渐爱上这门功能强大、灵活的语言了。
下面就分享一下学习经验:
关于如何学习C++,这个问题光嘴讲是没用的,还是需要自己动眼、动手、动脑。总结下来就无非这三个步骤:
1.学
学,不管是看书、看视频、还是参参加培训都可以,至少要系统化且持续性的去学习这门语言。个人建议如果有条件参加培训是最好的,如果没有可以看视频学习。但是不管是哪种方式,我都推荐大家一定要看书,跟着书本学习。不管你是培训还是看视频,思路都是跟着别人走的,只有看书才会有自己的理解,才更深刻。
2.抄
抄,此处意为对着教程上的代码抄或者半key半抄,至少要将项目通过自己的手实现,并且能正常运行。这个过程是十分痛苦的。很多人可能在学知识的时候觉得自己都会,但是一到自己key的时候就捉襟见肘了,甚至对着抄debug时仍是一大堆错误,这段时间是怀疑人生的时间,一定要坚持、坚持、再坚持。
比如最简单的helloword、文件读取、标准流输入输出等
intmain()
{
printf(helloword);
couthelloword;
inta;
cina
}
3.写
等熟练到一定程度,就需要自己是独立实现一个小功能或者开发一个小项目了,这中间一定会遇到很多问题,可以查资料、查教材、咨询其他人等。等你能独立实现自己想实现的功能的时候,那么恭喜你已经入门了,后面会越来越顺利。
下面总结一些C++学习的难点:
指针
关于指针已经讲过很多次了。理解指针你需要先理解计算机内存和内存地址概念,还有*和运算符。
比喻式理解:
内存可以理解为土地,内存地址理解为土地编号,当我们的程序在创建变量和对象时,计算机会充当规划局的角色为变量和对象划分一块有编号的土地存放变量和对象,这就叫内存,而编号就叫内存地址。土地有使用期限(70年),期限后收回,计算机中变量和对象释放时也会释放内存被回收。
指针:指针本身也是一个变量,类似int或者float类型,只不过int存放的是10、等这样的整型数据,而指针变量存放的是内存的地址。
*运算符:取内存地址上所存对象。
运算符:取对象所在内存的地址。
指针指向:我们常说的某某指针指向谁,意思是,这个指针变量存放着那个对象在计算机内存中的地址。
泛型编程
C++的泛型是基于模板实现的。不管是类模板或是函数模板,都不是真正的类或函数,只是一个编译器用来生成代码的蓝图。
为什么需要泛型编程呢?
最简单的一个例子,假设你实现了一个链表的类,可以用来动态存储int型数据。但是现在又有一个需求是动态存储string类型的数据,这时候你怎么办呢?重新为存储string数据的链表单再实现一个类?这显然是不符合代码重用性原则的,这时候你可能会想到能不能将数据类型用参数的方式传进去。这就是C++泛型编程的由来;
函数模板
数据的类型也可以通过参数来传递,若在函数定义时可以不指明具体的数据类型,当发生函数调用时,编译器才根据传入的实参进行自动地推断数据类型,这样就实现了函数的模板。利用虚拟的类型来作为一个标识符来占位,等发生函数调用时再根据传入的实参来反向推断出真正的类型。
voidchange(Ta,Tb)
{
Ttemp=a;
a=b;
b=temp;
}
上面的代码实现了一个两个数交换的通用模板函数,T类型就是那个占位标识符。该模板实现了一个函数可以交换任意数据类型的两个参数。
测试一下
inta=10,b=20;
change(a,b);
couta
b;
stringc=iloveu,d=iloveutoo;
change(c,d);
coutc
d;
templatetypenameT或templateclassT都可以,并且T类型参数可以有多个:templatetypenameT1,typenameT2.....
类模板
类模板中定义的类型参数可以用在类声明和类实现中。类模板的目的同样是将数据的类型参数化。
templateclassT1,typenameT2
classMyClass
{
public:
MyClass(T1a,T2b):a_(a),b_(b){};
T1Func1();
voidFunc2(T2x);
private:
T1a_;
T2b_;
};
templateclassT1,typenameT2
T1MyClassT1,T2::Func1()
{
T1temp=this-a_;
returntemp;
}
templateclassT1,typenameT2
voidMyClassT1,T2::Func2(T2x)
{
this-b_=x;
}
STL
C++的泛型本来就是为了STL而推出的,STL(标准莫板块)包含常用数据结构(如链表、可变长数组、排序二叉树)和算法(如排序、查找)的模板。它是一个十分强大且实用的库。
STL中容器即实现在类模板的基础上。算法如排序、查找等算法是实现在函数模板的基础上。
C++STL容器分顺序容器和关联容器。顺序容器包括:可变长动态数组vector、双端队列deque、双向链表list。它们的元素与位置顺序有关,与元素大小无关。关联容器包括:set、multiset、map、multimap。关联容器内的元素是排序的,元素的顺序直接关联元素本身,没有物理顺序。
任何容器都自带迭代器函数,他们是:
begin():返回指向容器中第一个元素的迭代器。
end():返回指向容器中最后一个元素后面的位置的迭代器。
rbegin():返回指向容器中最后一个元素的反向迭代器。
rend():返回指向容器中第一个元素前面的位置的反向迭代器。