C++ code到运行程序
作为一个c++程序员这个应该是最应该知道的细节,简言之:编译----链接----可执行的程序。这里所说的细节主要是第一步的细节,编译器如何把c++代码编译成目标代码。概括的讲是把c++代码转化成cpu能认识的东西。这个过程十分的复杂,需要解析c++标准这个庞大的语法体系,还要支撑起面向对象中的一些特性,比如继承,多态,封装等等,这个过程也由于编译器不同而不同,虽然都是c++编译器,编译出来的代码是不同的,这就导致了一些问题。因为c++标准并没有定义编译完成之后的代码的规范。这便造成了一些技术的诞生。也可以看出c++标准是针对程序员而言的,c++标准约束程序员,编译器来解析c++标准,来实现它,然而有意思的事情是c++支持指针,这个东西可以直接访问内存,这就相当于c++提供了一个后门来破坏自己定义的语言特性。可以通过这个“后门”来直接访问内存里的东西,但是一般的状况是程序崩溃,这是因为对内存的结构不是十分清楚的缘故,如果你能了解内存的布局,就可以超越c++语言的特性,利用编译器来做自己任何想做的事情了。
理解封装
封装是实现信息隐蔽的一种技术,其目的是使类的定义和实现分离。C++的一个特性,相信很多的人自认为理解,完全的理解,至少以前的我是这么认为的,在三个特性中我认为封装性最容易理解,但是随着对面向对象的了解和认识,我对封装性有了新的认识,感觉以前的认识十分的片面。正如上面所说封装性是c++语言的特性,而语言是用来约束程序员的,以前的理解就是类像一个包,而里面有一些数据,程序员的代码不能随便访问。然而这种封装是比较片面的。
Everything has a purpose,而封装存在的理由就是重用,重用就是写的一个代码库可以在很多地方重用,而且易于扩充。在一块内存中可以被许多应用程序运用,从开发的角度这样十分的省事,不必做重复的工作,在使用的角度,十分的节约内存,以前一个程序要加载一个库,现在几个程序只需加载一个库就可以了。这就是重用,使用以前的概念是无法实现这个目的的。聪明的程序员解决了这个问题。使用com组件技术,做到了二进制级别的代码重用。相当于扩充了操作系统,因为操作系统就是一个开放的接口,供应用程序调用功能。这就需要二进制级别的封装,
而由于一样的c++代码由不同的编译器编译出来的代码不一样,造成了代码之间的兼容问题。因为你封装起来的东西给了使用不同编译器的程序员获得的代码是不一样的,这样就不具备扩充性和灵活性。不能实现代码重用。
所以c++语言级别的封装性是十分狭隘的。
各种角度看封装
用户:我只需要个能用的,能升级的产品。
客户程序员:我需要的是可扩展的,封装的,插件式的库,这个库的东西不能影响到程序框架中的其他部分
库程序员:给客户程序员一个接口和一个二进制级别的代码。以实现可扩充行和可重用性。
内存:对我而言没有封装,计算机的一个基本概念,越往底层限制的东西越少。
编译器:我编译出来的代码要具有封装性,必须处理我和同行之间的差异。
C++语言:无辜的我是用来限制程序员的。但是也可以使用我的巧妙规则开提高你的水平,来实现你所需要的重用和扩充性。