佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 4838|回复: 32

什么是object-oriented programming?c与c++的分别是?

  [复制链接]
发表于 30-12-2008 08:48 PM | 显示全部楼层 |阅读模式
小弟刚接触programming。。c language也学到7788了。。现在想学c++。。
看了些关于c与c++分别的articles。。还是不是很明白。。什么是oop呢?c与c++最大的分别在哪里?

还有directX与c++的关系?我看了些directX的教学。。是用visual c++写的?

小弟有google过相关资料的。。但是英文不太好。。很多东西都不能完全理解。。希望高手能解答
回复

使用道具 举报


ADVERTISEMENT

发表于 31-12-2008 12:26 PM | 显示全部楼层
哇!这位兄弟厉害哦,刚接触programming就已经把C学得7788了。。。想当初我可是花了三年,C Programming才毕业的呢。。。

好了,不开玩笑了,正经回答问题。

事先声明,我并不算是C++高手,OOP 也只是一知半解,够赚吃的程度罢了。。。

首先,关于OOP,简单一句,就是把program里面的主要零件设计成为一个独立的个体,也就是物件(Object),其定义是:

1)Self-encapsulation,根据我的蹩脚翻译,呃,应该是“自我包含”。其意思就是说这个物件必须包含所有它所需的功能,它并不需要通过外来的Functions/libraries来获得这些功能。

打个比方,一个称为“手提电话”的物件,其本身就应该包含所有的功能,例如:拨打电话,接收电话,发送信息,接受信息,记录通讯录,发出铃声,在荧幕上显示信息等等的功能。这些功能都能够在“手提电话”这个物件里面找到,而不是需要通过外接式的方法(例如连接一台电脑)获得。另一方面,这些功能的细节对于使用者也应该是透明化的,也就是说当这个手提电话收到来电信号时,使用者只要按下“接听电话”按钮,就可以启动这个功能,而不需要去管如何从天线提取信号,如何解码信号,如何把信号转换成声音,如何把声音通过扬声器播放出来等等。

2)Inheritance,也就是功能继承。你能够使用一个物件class作为另一个class的基础,并在那上面加入更多的功能。例子:
  1. class 手提电话 //base class
  2. {
  3.     contact myContact[100];

  4.     接听电话();
  5.     拨打电话();
  6.     发送信息();
  7.     接收信息();
  8.     荧幕显示();
  9.     铃声();
  10. };
复制代码
以上是一个“手提电话”的class,现在我们要以它作为基础推出新的“PDA手机”:
  1. class PDA手机:手提电话 //inherit all functions from class 手提电话
  2. {
  3.     行事历();
  4.     播放影片();
  5.     播放MP3();
  6.     触控荧幕();
  7. };
复制代码
从表面上来看,“PDA手机”好像缺乏拨打电话的功能,但是事实上你可以呼叫    PDA手机.拨打电话();,因为PDA手机继承了手提电话的所有功能。相同的,PDA手机也同样拥有100个通讯录(myContact)。

3)Polymorphism,呃,我也不知道该如何翻译这个词,勉强翻过来就是“变化无穷”吧?承接以上的例子,
  1. class 手提电话
  2. {
  3.     拨打电话();
  4.     。。。
  5. };

  6. class PDA手机:手提电话
  7. {
  8.     拨打电话(快捷拨号键);
  9.     。。。
  10. };
复制代码
在这里,我们变化了PDA手机里的“拨打电话”这个功能。现在,PDA手机拥有两个“拨打电话”功能,分别是:
PDA手机.拨打电话();//继承自class 手提电话
PDA手机.拨打电话(快捷拨号键);//PDA手机变化出来的版本

严格来说,第二个版本的拨打电话(快捷拨号键)是第一个版本的 overloaded 版本,它们适用相同的名字,却接受不同的参数,第一个不接受任何参数,第二个则接受一个参数。

再来另一个说法:
  1. class 手提电话
  2. {
  3.     拨打电话()
  4.     {
  5.          呼叫号码 = 从键盘读取号码();
  6.          向总台发出通讯要求(呼叫号码);
  7.     }
  8.     。。。
  9. };

  10. class PDA手机:手提电话
  11. {
  12.     拨打电话();
  13.     {      
  14.        if((呼叫号码 = 从触控荧幕获取号码()) != NULL)
  15.             向总台发出通讯要求(呼叫号码);
  16.        else
  17.        {
  18.             呼叫号码 = 从键盘读取号码();
  19.             向总台发出通讯要求(呼叫号码);
  20.        }
  21.     }
  22. }
复制代码
上面的情形则是,两个class都有相同的“拨打电话()”,而两者都是不接受任何参数的,不同的地方在于,“手提电话”的拨打电话()只接受从键盘提取号码,而“PDA手机”则还额外的加多一个从触控荧幕提取号码的功能。这里面的奥妙就在于,不管两者的内容有何差别,这个功能都是叫做“拨打电话()”,这就统一了所有的类似的功能的称呼,而不必使用一大堆不同的名字来区分稍微不同的功能(例如“从键盘拨打电话()”,“从触控荧幕拨打电话()”等等)

4)Abstraction,这个我就不是很熟悉,勉强要解释的话就是,你能够把几个不同的class组合成一个概括所有功能的class。。。例如
  1. //各个组件的class
  2. class 电池;//包含所有电池功能
  3. class LCD荧幕;//包含所有LCD的功能
  4. class 天线;//包含所有天线的功能

  5. class SmartPhone
  6. {
  7.     电池 高容量电池;
  8.     LCD荧幕 QVGA荧幕;
  9.     天线 内藏试天线;
  10.     ...   
  11. }
复制代码
以上就是把一系列各自完备的class组合成一个包含所有功能的class,这也是我唯一有用到的Abstraction功能。。。。

暂时就写这么多,其他的都是比较容易理解的概念。

C与C++的最大差别?C++ 能够支援OOP,C 不能。

Direct-X和C++没有任何直接的关系,一个是API(程式编程界面,也就是一系列的为了特定的功能而开发的公用程式,方便编程员编写程式用的),另一个则是一种电脑语言。勉强要说的话,DX 是使用 C++ 来开发的,同时它的运用界面也是根据C++的语言格式来设计的。

我能说的就这么一写,其他的就让其他高手来讲解吧。

[ 本帖最后由 geekman 于 31-12-2008 12:29 PM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 31-12-2008 06:18 PM | 显示全部楼层

回复 2# geekman 的帖子

哇。。谢谢大大的细心讲解。。迟点再去研究看看

c我学了几个月。。学是学了。。但程度麻麻

C应该没有用class吧?还是我还没学到 ?class就是object?
看起来有点像function。。但没有type和parameter。。

1,2,3也大略明白了。。4的abstraction看起来像nested structure。。

至于directX。。哈哈。。算了吧。。
回复

使用道具 举报

 楼主| 发表于 31-12-2008 06:20 PM | 显示全部楼层
我现在还在研究着要怎样用visual c++ 2008

solution是什么?做么开个new project都酱难的
visual studio 6.0容易很多咯
回复

使用道具 举报

发表于 31-12-2008 10:05 PM | 显示全部楼层
solution基本上可以算是project的加强版,它不只能够包含程式的源代码(source code),也能包含其他资源如图象,影音档案之类的。

虽然我没使用过VC++ 2008,不过我有在使用VC#,基本上两者的界面都差不多(同样都是Visual Studio),要开启一个新的project,选择File->New Project...,然后选择想要的peoject类型,例如Windows Application就可以了。
回复

使用道具 举报

发表于 31-12-2008 10:08 PM | 显示全部楼层
原帖由 屁股痒 于 31-12-2008 06:18 PM 发表
哇。。谢谢大大的细心讲解。。迟点再去研究看看

c我学了几个月。。学是学了。。但程度麻麻

C应该没有用class吧?还是我还没学到 ?class就是object?
看起来有点像function。。但没有type和 ...


Class可以通过Constructor来提供Parameters的,只是我没在例子里面使用罢了。
回复

使用道具 举报

Follow Us
发表于 24-1-2010 12:40 PM | 显示全部楼层
回复 3# 屁股痒

ABSTRACTION = 就是 做 一个 ABSTRACT CLASS 出来 。 意味着 , 那个 CLASS , 就是 事前 做完 已经 知道 要做的 东西 先 。

我 打个 比如 好了 。

就好象 你们 在 打 COMMAND AND CONQUER 这样 , 你知道了 MEMOTH TANK ( 打错别 怪我  问我不玩 C&C 的 ) 有 一个 SLOT 可以 让 兵仔 坐上去 大炮 那边 , 大炮车 就会 用 兵仔的 功能 。

  1. public abstract class memothTank {
  2.       public void doShoot () {  <--- 我们知道 大炮车 , 一定是 射 大炮的
  3.       // do Something
  4.      }

  5.      public abstract Boolean soldierSeat () ;  <----- 这个 我们 不知道什么 兵仔 坐 进去
  6.      public abstract Integer soldierWeapon () ; <--- 这个 我们不知道 兵仔是 拿什么武器的  
  7. }

  8. ------------------------------------------------------------------------------------------------------------------------------------

  9. public class soldier extends memothTank () {

  10.       public Boolean soldierSeat () { <----- 这里决定 什么 兵仔 可以 坐 大炮车
  11.          // doSomething
  12.      }

  13.      public Integer soldierWeapon () {  
  14.          // doSomething
  15.      }

复制代码


P.s : Abstract CLASS 只可以 EXTENDS , 不可以 INSTANTIATE ( memothTank mt = new memothTank() )  错
回复

使用道具 举报

发表于 23-1-2010 11:59 PM | 显示全部楼层
看了还是很blur
是不是class = object?
回复

使用道具 举报


ADVERTISEMENT

发表于 24-1-2010 12:17 PM | 显示全部楼层
Class 可以 说 是 OBJECT 。 不过 OBJECT 不是 CLASS ,

因为 OBJECT 是 又 CLASS “INSTANTIATE” 出来的 。。。 比如
  1. public class test1 {
  2.   public static void main (String args[]) {
  3.      test1 test = new test1 () <------ 就是 这里 。。。。。
  4. }
  5. }
复制代码
其实 JAVA , 来来去去 , 都是 那 几个 CONCEPT 。。

1) Inheritance
2) Encapsulation
3) Polymorphism - Override / Overload

只要你 懂 这 几个 , 就可以 在 JAVA 界 找吃了
回复

使用道具 举报

发表于 24-1-2010 12:24 PM | 显示全部楼层
回复 6# geekman

我来给 例子 好了 。。。

  1. public class rectangle {

  2.         public rectangle () {
  3.         }

  4.         public rectangle (Integer width , Integer height) {
  5.               this.width  = width ;
  6.               this.height = height ;   

  7.         }


  8.         public rectangle (Integer width) {
  9.               this.width = width ;

  10.         }  
  11. }
复制代码


在以上 的 CODE , 你 可以 看到 有 3 个 CONSTRUCTOR 。。 都是 用 一个 名字 , 叫 RECTANGLE 。

如果 你 要 用 第一个 CONSTRUCTOR , 你 就 这样做 , rectangle rec = new rectangle () ;
如果 你 要 用 第二个 CONSTRUCTOR , 你 就 这样做 , rectangle rec = new rectangle (1 , 2);
如果 你 要 用 第三个 CONSTRUCTOR , 你 就 这样做 , rectangle rec = new rectangle (1);
回复

使用道具 举报

发表于 24-1-2010 04:20 PM | 显示全部楼层
instantiate有点把class duplicate成为一个new object的意思吧?
extent和abstract我迟点再研究
现在课程教到instantiate而已
不过对于concept还是blur blur的 
回复

使用道具 举报

发表于 24-1-2010 08:31 PM | 显示全部楼层
回复 11# 无言的豆腐

不是 DUPLICATE , 而已 做 一个 新的 OBJECT 出来 ,

例如 你有个 CLASS , 叫 HUMAN

里面 有 NAME 和 AGE

当你 INSTANTIATE 一个 HUMAN 时 , 代表 你 做 一个 OBJECT 出来 ,

Human you = new Human() ;
you.name = "无言的豆腐"

Human Me = new Human() ;
me.name = "兔仙人" ;
回复

使用道具 举报

发表于 26-1-2010 09:01 PM | 显示全部楼层
我lecturer讲是duplicate
只不过用另一个方式来讲
如果不是duplicate, then Instantiate是什么意思哦?
回复

使用道具 举报

发表于 26-1-2010 11:06 PM | 显示全部楼层
本帖最后由 jasonmun 于 26-1-2010 11:09 PM 编辑

CLASS 是物件(Object) 的设计构图(blueprint)..
用以产生一个或多个物件(Object) ..

Instantiate 指是实例(实现例子).. 通过CLASS, 实例产生一个物件sample出来..
回复

使用道具 举报

发表于 31-1-2010 02:08 AM | 显示全部楼层
本帖最后由 megablue 于 31-1-2010 02:19 AM 编辑

真正来说C和C++的分别只是Syntax上.
C也可以写(用上)Object Oriented的代码(概念), 要看的只是编程者的功力.
所谓的Object Oriented只是一个方便代码重新使用的概念....
我lecturer讲是duplicate
只不过用另一个方式来讲
如果不是duplicate, then Instantiate是什么意思哦?
无言的豆腐 发表于 26-1-2010 09:01 PM




我的理解是class 是身体。
object 是有灵魂的身体。
当初始化时... 身体就会被复制和加入灵魂.
灵魂控制了身体
灵魂能做的事情则会被身体局限着.身体的特性这会被灵魂影响。
回复

使用道具 举报

发表于 6-2-2010 04:12 PM | 显示全部楼层
真正来说C和C++的分别只是Syntax上.
C也可以写(用上)Object Oriented的代码(概念), 要看的只是编程者的功力 ...

megablue 发表于 31-1-2010 02:08 AM

这个。。。

好仔细。。。
谢啦megablue
回复

使用道具 举报


ADVERTISEMENT

发表于 8-2-2010 02:50 PM | 显示全部楼层
这个。。。

好仔细。。。
谢啦megablue
无言的豆腐 发表于 6-2-2010 04:12 PM


你有学到就好了.... 我只是试着用另一种方式呈现OO个概念...很笼统.
回复

使用道具 举报

发表于 23-2-2010 04:50 PM | 显示全部楼层
我想问...,如果数学差的人能够编写游戏程序吗?
回复

使用道具 举报

发表于 23-2-2010 09:14 PM | 显示全部楼层
回复 18# jilly2413


    能啊,只是你可能无法理解/编写一些比较复杂的运算。
回复

使用道具 举报

发表于 23-2-2010 09:21 PM | 显示全部楼层
我英文差,数学差和科学差...我从来没好好读过书,能的是华文,本身会作词填词。
有没有程序是华文写的?
很想进这行...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 27-4-2024 10:30 AM , Processed in 0.070888 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表