回首页 回首页 ◎ 设为首页  
◎ 收藏本站  
◎ 给我留言  
  
  首 页  C/C++教程  C++之父的FAQ  C/C++动向  C/C++源代码  C/C++误区  Unix/Linux  下载中心  乱七八糟  蚂蚁的Blog  
  当前位置:首 页 >> C++之父的FAQ >> 普通 FAQ >> [翻译] 什么是面向对象编程?它的伟大之处是什么?
最 近 更 新
[翻译] 为何 C++ 没被用..
[转] 你推荐哪个C++编译..
[转] 你有没有想到C++会..
[转] C++是面向对象语言..推荐
[翻译] 为何 C++ 如此庞..
[翻译] 您是使用何种语..
[翻译] “C++”何得此名?
[翻译] C++ 归您所有吗?
[转] 为什么AT&T要支持C..
[转] 你为什么要发明C++?
最 新 推 荐
[转] C++是面向对象语言..推荐
[翻译] 您怎么看待 C++/..推荐
[翻译] 何谓泛型编程?..推荐
[翻译] 什么是面向对象..推荐
[转] 如果不必考虑和 C ..推荐
[翻译] 类的伟大之处是..推荐
[翻译] C 是 C++ 的子集..推荐
热 门 排 行
[转] C和C++的区别是什..
[翻译] 为何 C++ 没被用..
[转] 你推荐哪个C++编译..
[翻译] 什么是面向对象..推荐
[转] 学习C++从哪本书开..
[翻译] 类的伟大之处是..推荐
[转] 我怎么开始学习C++..
[转] 学习C++需要多少时..
[翻译] 为何编译 C++ 版..
[翻译] C 是 C++ 的子集..推荐
站 内 搜 索

Web stdcpp.cn
关键词

搜索方式

搜索范围

精确匹配
广 告

[翻译] 什么是面向对象编程?它的伟大之处是什么?


来源:蚂蚁的 C/C++ 标准编程 作者:Bjarne Stroustrup 翻译:antigloss 等级:精品
发布于2007-01-05 23:32 被读1752次 【字体:

    面向对象(object oriented, OO),面向对象编程(object-oriented programming, OOP),以及面向对象编程语言(object-oriented programming languages, OOPL)的定义多种多样。想了解我对 OO 的详细看法,请阅读 C++ 为什么不仅仅是面向对象的语言。我在那里写道,OOP 这种编程风格起源于 Simula(约 40 年以前!),它依赖于封装(encapsulation)、继承(inheritance)以及多态(polymorphism)。就 C++(及许多其它源于 Simula 的语言)而言,OOP 的意思是利用类层级(class hierarchies)及虚函数进行编程,从而可以通过精制的接口操作各种类型的对象,并且程序本身也可以通过派生(derivation)进行功能增量扩展。

    你可以从类的伟大之处是什么这篇文章了解到“普通类(plain classes)”的伟大之处。把多个类组织成类层级是为了表达类之间的层次关系并且利用这些关系简化代码。

    要想真正理解 OOP,就要看些例子。例如,你可能有两个(或者更多)设备驱动共用一个公共接口:

        class Driver {                            // 公共驱动接口
        public:
            virtual int read(char* p, int n) = 0; // 从设备中读取最多 n 个字符到 p
                                                  // 返回读到的字符总数
            virtual bool reset() = 0;             // 重置设备
            virtual Status check() = 0;           // 读取状态
        };

Driver 仅仅是一个接口。它没有任何数据成员,而其成员函数都是纯虚函数。通过这些接口就可以使用某个驱动;不同类型的驱动负责对这个接口进行相应的实现:

       class Driver1 : public Driver { // 某个驱动
       public:
           Driver1(Register); // 构造函数
           int read(char*, int n); 
           bool reset();
           Status check();
           // 实现细节
       };

       class Driver2 : public Driver { // 另一个驱动
       public:
           Driver2(Register);
           int read(char*, int n); 
           bool reset();
           Status check();
           // 实现细节
       };

注意,这些驱动含有数据成员,可以通过它们创建对象。它们实现了 Driver 中定义的接口。不难想象,可以通过这种方式使用某个驱动:

       void f(Driver& d) // 使用驱动
       {
           Status old_status = d.check(); 
           // ...
           d.reset();
           char buf[512];
           int x = d.read(buf,512);
           // ...
       }

这里的重点是,f() 不需要知道它使用的是何种类型的驱动;它只需知道有个 Driver 传递给了它;也就是说,有一个接口传递给了它。我们可以这样调用 f() :

       void g()
       {
           Driver1 d1(Register(0xf00)); // create a Driver1 for device
                                        // with device register at address 0xf00

           Driver2 d2(Register(0xa00)); // create a Driver2 for device
                                        // with device register at address 0xa00
           // ...
           int dev;
           cin >> dev;

           if  (dev==1)
               f(d1); // use d1
           else
               f(d2); // use d2
           // ...
       }

注意,当 f() 使用某个驱动时,与该驱动相对应的操作会在运行时被隐式选择。例如,当 f() 得到 d1 时,d.read() 使用的是 Driver1::read();而当 f() 得到 d2 时,d.read() 使用的则是 Driver2::read()。这被称为运行时调度或者动态调度。本例,f() 无法得知调用的是何种设备,因为那是根据输入选择的。

    请注意,OOP 并非万能药。不要简单地把“OOP”等同于“好”。如果你的问题的基本要素中没有与生俱来的层级关系,那么类层级和虚函数对你的代码不会有任何帮助。OOP 的优势在于类层级可以有效地表达很多问题;OOP 的主要弱点在于太多人设法强行用层级模式解决问题。并非所有问题都应该面向对象。也可以考虑使用普通类(plain class)、泛型编程和独立的函数(就像数学、C,以及 Fortran 中那样)作为解决问题的方案。

原文地址:http://www.research.att.com/~bs/bs_faq.html#oop

本文版权归 蚂蚁的 C/C++ 标准编程 以及 作者 Bjarne Stroustrup 翻译:antigloss 共同所有,转载请注明原作者和出处。谢谢。



相关专题:C++ 之父的言论
[转] 我该把const写在类型前面还是后面?
[翻译] 我应该使用按值传递还是按引用传递?

上一篇:[转] 为什么C++没有垃圾回收机制?
下一篇:[翻译] 何谓泛型编程?其伟大之处何在?

共有评论 0 条 网友评分 0分 查看全部评论

查看全部评论

【发表评论】 评分:1分 2分 3分 4分 5分


验证码:

Powered By Www.Xydw.COM Ver1.14 管理
Copyright © 2005-2006 蚂蚁的 C/C++ 标准编程 All Right Reserved. XCMS
粤ICP备06014124号   站长:Antigloss