C++中面向对象的理解



1、对于OO(面向对象)的含义,并不是每个人的看法都是相同的。即使在现在,如果问十个人,可能会得到15种不同的答案。几乎所有的人都会同意继承和多态是OO中的概念。大多数人还会再加上封装。还有一些人会加上异常处理,而可能会没有人将模板也包含进去。问题的关键在于:对于某个特性是否是属于OO的,往往都存在着不同的观点,而每一种观点都有着热情的拥护者。
2、C++的标准化工作对C++最重要的贡献就是:对功能强大的抽象机制提供了更有力的支持,从而降低了软件的复杂性。C++并不仅仅只是一种面向对象的语言。它能够支持好几种编程风格,包括面向对象编程风格和泛型编程风格。这些编程风格都是非常重要的,因为每一种编程风格都提供了很灵活的方法来通过抽象机制对代码进行组织。面向对象编程使我们能够把对象的状态以及处理这些状态的函数绑定在一起,而封装和继承则使我们能够管理相互依赖性,并使能够通过更清晰和更容易的方式来重用代码。泛型编程则是一种较新的风格,它能够使我们编写出一些函数和类,它们能够对其他一些“未定义的、没有关联的和未知类型”的函数和对象进行操作,从而为降低程序中耦合性和相互依赖性提供了一种独特的方式。当前,在其他的一些语言中也提供了对泛型的支持,但是都没有像C++中对泛型的支持这样强。事实上,现在的泛型编程可能都要归功于C++独特的模板形式。今天,在C++中提供了许多功能强大的方式来表达抽象机制,而由此带来的灵活性就是C++标准化中最重要的成果。
3、在C++中没有模块系统(无论是完整的还是不完整的);它缺乏其他一些重要的特性,例如内存垃圾收集机制,它有静态类型检查,但却并不一定是“强”类型检查。
1、强/弱类型是指类型检查的严格程度的。语言有无类型,弱类型和强类型三种。无类型的不检查,甚至不区分指令和数据。弱类型的检查很弱,仅能严格的区分指令和数据。强类型的则严格的在编译期进行检查。

强类型定义语言:强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。举个例子:如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语言是类型安全的语言。

弱类型定义语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。

2、动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。

静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。

强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。另外,“这门语言是不是动态语言”与“这门语言是否类型安全”之间是完全没有联系的!

3、封装

封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。在面向对象的编程语言中,对象是封装的最基本单位,面向对象的封装比传统语言的封装更为清晰、更为有力。面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个“模块”中,也就是一个类中,属性用变量定义,行为用方法进行定义,方法可以直接访问同一个对象中的属性。

第一、良好的封装能够减少耦合。
第二、类内部的实现可以自由地修改。
第三、类具有清晰的对外接口。
封装的好处很好理解,我们的房子就是一个类的实例,室内的装饰与摆设只能被室内的居住者欣赏和使用,如果没有四面墙的遮挡,室内的所有活动在外人面前一览无遗。由于有了封装,房屋内的所有摆设都可以随意地改变而不用影响他人。然而,如果没有门窗,一个包裹得严严实实的黑箱子,即使它的空间再宽阔,也没有实用价值。房屋的门窗,就是封装对象暴露在外的属性和方法,专门供人进出,以及流通空气、带来阳光。

4、继承

在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种is--a关系,提高了软件的可重用性和可扩展性。

第一、子类拥有父类非private的属性和功能;
第二、子类具有自己的属性和功能,即子类可以扩展父类没有的属性和功能;
第三、子类还可以以自己的方式实现父类的功能(方法重写)。
对于构造函数,它不能被继承,只能被调用。继承会破坏封装,父类实现细节暴露给子类。这其实是增大了两个类之间的耦合性,并且是强耦合的关系。

5、多态

同一操作作用于不同的类的实例,将产生不同的执行结果,即不同类的对象收到相同的消息时,得到不同的结果。多态是面向对象程序设计的重要特征之一,是扩展性在“继承”之后的又一重大表现 。对象根据所接受的消息而做出动作,同样的消息被不同的对象接受时可能导致完全不同的行为,这种现象称为多态性。

虚方法是按照其运行时类型而非编译时类型进行动态绑定调用的。

6、抽象

抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。

第一、抽象类不能实例化;
第二、抽象方法是必须被子类重写的方法;
第三、如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还可以包含其他一般方法。

7、接口

接口是把隐式公共方法和属性组合起来,以封装特定功能的一个集合。一旦类实现了接口,类就可以支持接口所指定的所有属性和成员。声明接口在语法上与声明抽象类完全相同,但不允许提供接口中任何成员的执行方式。所以接口不能实例化,不能有构造方法和字段;不能有修饰符;不能声明为虚拟的或静态的等。还有实现接口的类就必须要实现接口中的所有方法和属性。一个类可以支持多个接口,多个类也可以支持相同的接口。
抽象类可以给出一些成员的实现,接口却不包含成员的实现,抽象类的抽象成员可被子类部分实现,接口的成员需要实现类完全实现,一个类只能继承一个抽象类,但可实现多个接口等等。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值