噢,我亲爱的++
普契尼的独幕歌剧歌剧《贾尼·斯基基》完成于1918年,同年初演于纽约。
本剧的剧情取自意大利诗人但丁(1265- 1321)的长诗《神曲·地狱篇》中的一个故事:富商多纳蒂死了。其遗嘱内,将遗产全数捐献给某一教堂。在场亲友大失所望。众人请贾尼·斯基基假扮多纳蒂,骗过公证人,另立遗嘱,遗产由众亲友均分。公证人到场。结果斯基基将少量遗产分与众人,大部分留给了自己。遗嘱录毕,公证人离去。众大哗,斯基基从病榻跃起,持棒驱散众人。
剧中斯基基的女儿劳蕾塔为表达对青年努奇奥的爱情,对其父唱起了这首美妙绝伦的咏叹调——“我亲爱的爸爸”:
我愿到露萨港去,买一个结婚戒指。
我无论如何要去,假如您不答应,
我就到威克桥上,纵身投入那河水里。
我多痛苦,我多悲伤。
啊 ! 天哪 ! 我宁愿死去 !
爸爸,我恳求你 !
爸爸,我恳求你 ! ”
按照C/C++中对于后置操作符++的定义,操作数增加1,并返回原来的值。于是,有人根据这个给C++遍了一段笑话,流传甚广。那么,C++是否相对C加了那么一点点,然后还是返回原来的值呢?那就让我们来“实地考察”一下,了解这个++究竟加了多少。
我不打算罗列C++的各种纷繁复杂的特性。已经有无数书籍文章做了这件事,肯定比我做的好得多。我要做的,是探索如何运用C++的一些机制,让我们能够更方便、快捷、容错地开发软件。这些特性很多都是非常简单的,基本的。正因为它们基本,很容易为人们所忽略。另一些则是高级的,需要多花些时间加以掌握的。但是,这些特性也具有一些简单,但却非常实用、灵活和高效的用法。
相对于C,C++最主要的变化就是增加了类。严格地讲,类是一种“用户定义类型”,是扩展类型系统的重要手段。类从本质上来说,是一种ADT(Abstract Data Type,抽象数据类型)。笼统地讲,ADT可以看作数据和作用在这些数据上的操作的集合。
类提供了一种特性,称为可见性。意思是说,程序员可以按自己的要求,把类上的数据或函数隐藏起来,不给其他人访问。于是,通过可见性的控制,可以让一个类外部呈现一种“外观”,而内部可以使用任何可能的方法实现类的功能。这称为“封装”。
呵呵,听烦了吧。这些东西是学过C++(或者任何时髦的OOP语言)的都已经烂熟于胸了。这样的话,我们就来点实际的,做个小案例,复习复习。温故而知新嘛。:)
案例非常简单,做一个圆类。让我们从“赤裸”的C结构开始吧:
{
float center_x;
float center_y;
float radius;
};
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
{
public :
float get_center_x() { return left; }
float get_center_y() { return top; }
float get_radius() { return bottom; }
private :
float center_x;
float center_y;
float radius;
};
然后,面积计算公式稍作改动就行了:
return PI * rc. get_radius() * rc. get_radius();
}
这时,如果我改变了Rectangle的数据存储方式,也不会影响Area函数:
{
public :
float get_center_x() { return (left + right) / 2 ; }
float get_center_y() { return (top + bottom) / 2 ; }
float get_radius() { return (right - left) / 2 ; }
private :
float left;
float top;
float right;
float bottom;
};
运用了封装之后,类的实现和接口分离了。于是我们便可以在使用方神不知鬼不觉的情况下,改变我们的实现,以获得更好的利益,比如效率的提升、代码维护性的提高等等。
当我们尝到封装的甜头之后,便会继续发扬光大:
{
public