网站首页 > 基础教程 正文
在前面的讲座中我已经跟大家深入地介绍了C和Rocket这两种计算机编程语言。对于创客道的践行者而言,在开始创业的阶段,如果能够熟练地掌握这两种语言的话,那么作为开始,应该可以的。这里我想让大家回顾一下我在前面说的这个观点。
想了解更多知识,一起学习交流共同进步点击链接加入群【C语言/C++学习②】: http://jq.qq.com/?_wv=1027&k=2EMJ991
对于一个创业项目选择什么编程语言,应该根据你的创业项目特点来进行选择,我现在已经提供了两种语言供大家选择,如果大家觉得这两种语言还不够的话,那么我在接下来的讲座中,我会给大家提供更多的选择。
在介绍这些新的选择的时候,我会按照我的观点,把斯托曼院士的建议从C和Lisp里面得到的关于计算的感悟一以贯之地推广到新的语言的学习里面去,这是一个方法。第二个就是看看我介绍的新的选项,它具有哪些方面突出的特长,它擅长做什么事情,看看是否满足特定创业项目的需求。
我在后面的讲座中会按照这两种方式来讲解一些新的语言选项,如果我们把C和Lisp看成编程语言谱系的两端,可以先从C这端出发看看其他的语言,第一个要考察的对象就是C++语言,它是对C语言的扩展。曾经有人调侃C++语言“C++是C这条狗被钉上软肢而形成的章鱼”。C++对C最初的扩展是增加了类,后来开始增加其他范式的支持,比方说对范型的支持,在新的语言规范,也就是2014年发布的C++语言规范C++14这个版本里面,又增加了很多新的特性。
为了解说的方便,我在讲座里面,只针对C++1998年的标准进行讲解,C++语言的发明人,比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup)教授,曾经写过一本书,叫做《C ++ programming lanuage》,等到C++的1998年标准发布以后,他出版过这本书的第三版的特别版,这个版本是那本书的一个重大里程碑,因为在C++ 1998年版本发布以后,C++语言完全成熟了,所以在下面的解说中,将以这个版本的C++为主要的介绍对象。毫无疑问,要理解C++首先要理解C++类的概念(也就是class), C++如何在C的基础上通过对C里的struct的改造得到class这个概念的。
我们回忆一下,前面在讲C的时候我们说过,C里面的static修饰符修饰函数时能将函数的作用域限定在它所在的文件里面,文件作为static函数的作用域,这是我们前面提到的观点。但是在很多情况下我们发现把文件作为函数的作用域仍然显得力度太大,在C里边为了解决这个问题不得不构造许多的文件,在文件里面放一个static函数,让它的作用域扩充到整个文件,而这个文件里如果新增加一个函数,这个函数与原来的函数有类似的功能的话,那这个时候对程序员会造成很大的负担,因为这两个函数有可能会产生逻辑上的干扰,所以我们需要一种方法,以一个文件为基础,在一个文件内部把它的力度尽量的减少,这样就可以在一个文件里边放上许多在逻辑上相互独立的函数。在这个情况下,需要引入类的概念,正好是对C的struct进行的扩展。在C++中struct被当成类,只不过类中所有的成员都是public 的,C++的struct和C 的struct在语法形式上是一样,但本质实现并不完全一样,这一点请大家搞清楚。实际上在学习C++的时候有大量的细节需要理清楚,特别是与C语言对比时,C++做了哪些新的扩展,大家一定要搞清楚。
因为有C++语言如此精致的扩展,所以当C程序员理解了C++的扩展之后,思维会变得非常的缜密,考虑的非常周全,做系统设计时让你考虑的滴水不漏,这是学习C++的额外好处。在C++中,类是一个容器,容器中可以放上一些数据成员,还可以放上一些函数成员,函数成员可以对容器中的数据成员进行操作,这是类的基本概念。在默认的情况下,C中定义的函数不能对类之外的东西进行操作,类外部的东西也不能对类内部的数据成员进行操作,对类内部的成员进行操作必须通过另外的机制进行操作。
在OOP的思想方法里面,首先通过向类的实例化对象发消息,通过消息调用对象中的方法,通过方法调用相应的内部逻辑来操作对象中的数据成员,这样就构造出对象的状态概念,这是OOP的基本思想。为了支持这个思想,C++ 的编译器在C编译器的基础上大大扩充了,它做了很多幕后的工作。一个C++的类有5个成员函数,分别是构造函数(Constructor)、析构函数(Destructor)、拷贝构造函数(Copy Constructor)、赋值运算符重载(Assignment Operator Overloading,这个运算符把等号重新定义),最后一个是print函数,这5个函数被增加到每一个C++的类里面来,学习C++要搞清这5个成员函数的功能,它们的作用和角色。
简要的回顾一下,构造函数关于基于类的对象是如何在内存里产生的,在类被初始化成为一个对象的时候,我们需要做许多的准备工作,包括类中的数据成员,如何初始化,如何为新产生的对象分配内存,这些就是构造函数要完成的事情,构造函数在C++里的写法和类的同名(这点请大家注意)。析构函数就是当一个对象在不需要的时候,如何去摧毁它,这样对象占用的资源就可以被系统回收,所以在析构函数中一定要对对象产生的内存资源如何进行回收进行详细的思考。拷贝构造函数是把一个已经存在的对象赋值给另外一个对象,有了拷贝构造函数以后,一个新对象的产生不用从原始社会做起了,它可以从一个已经存在内存中的对象开始做起,所以我认为拷贝构造函数是C++中设计的最妙的函数,一定要把拷贝构造函数的细节搞清楚,在用到这个函数时要用到赋值。
在5个函数中有一个关于赋值运算符的重载,C++有一个非常诡异的特性,它有定义了一批运算符,其中一个子集(也就是一部分运算符)的语义是可以重新定义的,这里用到了其中的一个运算符即等号,赋值运算符的重载会和拷贝构造函数的使用结合起来,在理解赋值运算符重载的时候,大家一定要特别地小心。最后一个print函数在调试的时候是非常有用的,让它去显示某一个对象的状态。
要理解C++类中这5个成员函数的特点,第一步要知道reference类型的引入,它的原因是什么,是为了解决C++编程中C里面指针类型的变量它所产生的不足而引入的,在不使用堆上内存的时候,C的指针和C++引用区别不太明显,然而当我们定义类里面对象会占用动态内存,也就是堆上的内存的时候,这个时候必须要使用C++的reference的这个类型,而我认为要理解C++的reference类型必须要知道编译原理,这一点我在讲黑客道的教学里面讲 C 的时候,你必须要理解C里面的这些细节,你不知道编译原理,你不知道C编译器如何工作的话,那你是学不好c的。同样的道理,在学C++的时候,你不理解编译器做了哪些工作,它是如何对待reference这个类型的,那你实际上也不理解reference这个类型的应用,在C++里面,reference类型实际上是在符号表里面增加一个新的纪录,这个纪录与某一个指针变量所指向的对象,它是会指向同一个对象,换句话讲,Reference Type实际上是一个指针的别名(Alias),有了这个理解之后,再去理解C++ 中的Reference Type就有一个很好的基础。
在搞清楚C++中类的定义之后,C++的编译器在幕后做的工作以后,我们还要知道模板(template)这个特性,为什么要学这个模板呢,这个模板有两种,一种叫做函数模板,一个叫做类模板,这里主要指类模板,因为有了类模板之后,再去理解1998年C++的标准库就比较容易了,这个是模板的重要性。我们要使用C++而不是使用C的原因就是C++提供了一个标准库,有了标准库后大大提高了我们写系统程序的生产力,要理解标准库,对模板的理解是必不可少的。一旦有了C++的标准库,设计系统程序时开发效率会大大提高,针对这一点,比雅尼·斯特劳斯特鲁普在C++编程语言(第三版)特别版中,第四部分的第二十五章,讲了类的作用,这一章请大家反复地阅读,对创客搞创业有指导意义。在这一章中,作者把类的作用分成7个类型,首先C++非常适合做框架,很多框架都是用C++语言编写的,比如QT图形用户界面的框架,好处是显而易见的,C++非常适合大规模的系统程序的开发。
在框架内部,在开发的时候可以放一些抽象类,刚刚设计的时候,概念不太清晰,有一些模糊的感觉,这个时候可以用C++的抽象类来表达模糊的感觉,然后你的开发过程中,你这些模糊的感觉会逐渐地变得清晰起来,这个时候,可以用C++节点类让你的概念清晰化。到了最后就是要给具体类,这是从框架到抽象类,从抽象类到节点类,从节点类到你的具体类,在这个过程中,我们还可以设计动作类,界面类,句柄类,这么一些辅助类,有了这7个类型的类以后,在做大型的系统程序开发的时候,就有了非常好的工具,C++非常适合干这个事情,这是我想要向大家指出的一点,换句话讲,C++不适合做应用程序,因为现在写大规模的应用程序有许多更好的选择,但是在大规模的系统程序开发上面,C++是一个非常理想的选择,请大家记住这一点。
猜你喜欢
- 2024-12-30 C++基础知识总结(超详细总结) c++ 基础
- 2024-12-30 [面试]C++中struct和class的区别是什么
- 2024-12-30 C++类和C语言的结构体有什么区别?linux C++第18讲
- 2024-12-30 C与C++利用pragma pack对结构体做成员打包对齐设置
- 2024-12-30 结构体所占内存大小 结构体所占内存大小是所有成员所占的内存字节数计算
- 2024-12-30 结构体的各种使用方法详细讲解-c\c++
- 2024-12-30 C++,结构体和类,结构体和类的区别,struct与class的区别
- 2024-12-30 C++编程:复合数据类型—结构体 c语言结构体复数运算
- 2024-12-30 C#与C++交互开发系列之复杂类型传递与解析
- 2024-12-30 C#和C++混合编程开发示例 c#,c++,c
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)