1.object与class:在object-oriented programming编程领域,对象(object)有更严格的定义。对象是由数据结构和用于处理该结构的过程(称为methods)组成的实体(instance)。这些方法由对象接收的消息激活。一个对象的内部数据结构与其他对象完全隔离(此属性称为“encapsulation”)。对象是基于模板生成的。从某个模板生成的实体(instance)的集合称为类。有一个重要的属性叫做继承,它允许在现有类上构建新的类,继承现有类的全部或部分特性,并允许扩展新特性。有些系统甚至实现了多重继承,允许一个类从多个父类继承。如果你还是没有懂,那么只要建立这样一个概念就行了,Object就是个“东西”,是“东西”就得占空间,在计算机中就得占一定内存,所以我们称他为实体(instance)。上述相档部份在描述“东西”的产生,它说“东西是模板产生的”,其实这模板(template)就是“东西”的属性描述,也就是类(class)。需要注意的是class是一种属性的描述,而并非实体,根据class产生的object才是实体。

2.instantiation:产生object的过程我们称之为实例化(instantiation),根据object class(或者template)产生一个实体的过程就是instantiation。

3.object-oriented programming:面向对象编程是一种编程方式,它使用“对象”作为程序的基本功能单元。程序员会花费很多精力来描述对象的属性,包括它们的数据和行为(处理数据的方法),并使用“类”的语法来展示他们的设计。当程序开始运行时,根据设计好的类,会创建出实际的对象。这些对象会相互合作,共同实现程序的功能。此外,像int、float、long这样的语言内置类型也可以看作是一种类,它们用于描述数据的性质,但通常没有相关的处理程序。

int i;  // i 是 一 个 int object.
float f; // f 是一个 float object.

4.object与class的关系:现在让我们以一个实例说明一下object与class的关系,假设我们的class设计如下:

 1 //CStroke描述线条应有的特征
2
3 class CStroke
4 {
5 //CStroke的行为
6 public:
7 void DrawStroke( /*....*/ ){ }; //画线条
8 void Serialize( /*....*/ ){ }; //档案调用
9
10 //CStroke的数据
11 protected:
12 vector<Point*>m_Array; //存储线条坐标
13 int m_penColor;//笔的颜色
14 int m_penWidth;//笔的宽度
15 int m_penStyle;//笔的样式
16 };

  于是每当使用者在屏幕上画一线条(stoke),计算机便有程序中产生一个CStroke object,其中有一个array准备用来存储线条上各点的坐标,以及三个int变量分别代表笔的颜色、宽度、样式。我们必肌设计一些UIQ函数,让使用者能够以滑动鼠标来代替画笔,直接在屏幕上输出构成线条的每一个点坐标,以下图为例,程序产生了8个CStroke object。

5. class的声明和实现( Declaration & Implementation):下面是 C++ class 的声明形式(declaration),通常放在 .h 文件中:

 1 class CPoint{
2 public:
3 CPoint(float x=0.0) :_x(x){}
4
5 float x(){return _x;}
6
7 void x(float xval ){_x=xval;}
8
9 protected:
10 float _x; // data member
11
12
13 };

  class内含有两种东西:一个是data member(例如上面的_x),一个是menber functions(例如上述的CPoint()以及两个x())。上例的三个member functions都直接在class中完成了实现,所以自动成为一个inline函数。通常是函数比较简单的我们才会这样做,如果函数比较复杂的,我们会在class declaration 中完成member functions的声明,而在.cpp文件中完成实现的部分(implementation)例如:

 1 //in hello.h
2
3 class CPoint{
4 public:
5 CPoint(float x=0.0) :_x(x){}
6
7 float x(); //只是member function的声明
8
9 void x(float xval );//只是member function的声明
10
11 protected:
12 float _x; // data member
13
14
15 };
1 //in hello.cpp
2 #include "hello.h"
3
4 float CPoint::x(){return _x;} //实现内容
5 void CPoint::x(float xval ){_x=xval;} //实现内容

6.符号命名习惯( Naming Convention):有一种常见的符号命名习惯是在class名称前面加上“C”,在data members名称前面加上"m_",至于member functions,并没有什么常见的命名习惯。

C++ 多态与虚拟:Class 语法语义的更多相关文章

  1. 多态与虚拟 : 物件导向的精髓 (侯捷在石器时代对OO的理解)

    [自序]虑而後能得(自序)故事接触 C++ 大约是 1989 年的事.那时候的 PC 以现在的眼光看,除了「蛮荒」之外没有更合适的形容词了.横扫千军的 Windows 3.0 还没有诞生,如今以 C+ ...

  2. 多态,虚拟方法,重写,接口,类库,委托,is,as运算符,泛型集合,万能变量

    多态:简而言之就是龙生九子,各有不同 有了继承,才有了多态 1.虚方法 virtual重写 override父类中的方法,在子类中并不适用,那么子类需要自主更改继承的方法或者是属性,那父类中加了vir ...

  3. Expression2Sql的一些语法更新

    前言 前一阵子给大家介绍了一个可以将Expression表达式树解析成Transact-SQL的项目Expression2Sql. 之后得到了广大读者的一些好评,也使得博主更有动力继续更新下去,然后一 ...

  4. C#面向对象:多态

    此文章转载网站:https://www.cnblogs.com/qixinbo/p/8244583.html 多态: 有多态之前必须要有继承,只有多个类同时继承了同一个类,才有多态这样的说法. 在继承 ...

  5. C#面向对象(三):多态

    前文链接: C#面向对象(一):明确几个简单的概念作为开胃菜 C#面向对象(二):封装和继承 今天来聊聊面向对象的多态,这部分算是比较重要和核心的,很多工作2年多的程序员其实对于面向对象和多态的理解也 ...

  6. JavaScript6 新语法 let 有什么优势

    最近看国外的前端代码时,发现ES6的新特性已经相当普及,尤其是 let,应用非常普遍 虽然 let 的用法与 var 相同,但不管是语法语义上,还是性能上,都提升了很多,下面就从这两方面对比一下 语法 ...

  7. Java 中多态的实现(下)

    Java 中多态的另一个语法实现是重写.重载是通过静态分派实现的,重写则是通过动态分派实现的. 在学习动态分派之前,需要对虚拟机的知识有一个初步的了解. 虚拟机运行时数据区 运行 Java 程序时,虚 ...

  8. Java将增加虚拟线程,挑战Go协程

    我们知道 Go 语言最大亮点之一就是原生支持并发,这得益于 Go 语言的协程机制.一个 go 语句就可以发起一个协程 (goroutin).协程本质上是一种用户态线程,它不需要操作系统来进行调度,而是 ...

  9. Java19虚拟线程都来了,我正在写的线程代码会被淘汰掉吗?

    Java19中引入了虚拟线程,虽然默认是关闭的,但是可以以Preview模式启用,这绝对是一个重大的更新,今天Java架构杂谈带大家开箱验货,看看这家伙实现了什么了不起的功能. 1 为什么需要虚拟线程 ...

  10. C/C++ 笔试题

    /////转自http://blog.csdn.net/suxinpingtao51/article/details/8015147#userconsent# 微软亚洲技术中心的面试题!!! 1.进程 ...

随机推荐

  1. AI助力快速定位数据库难题

    最近很多人都在讨论AI能否替代人类工作的话题,最近笔者正好遇到一个AI帮自己快速定位问题的实例,分享给大家,一起来切身感受下AI对于解决数据库问题的价值吧. 事情的经过是这样,有个朋友咨询我,说他最近 ...

  2. Saltstack 最大打开文件数问题之奇怪的 8192

    哈喽大家好,我是咸鱼. 今天分享一个在压测过程中遇到的问题,当时排查这个问题费了我们好大的劲,所以我觉得有必要写一篇文章来记录一下. 问题出现 周末在进行压测的时候,测试和开发的同事反映压测有问题,请 ...

  3. 动态水印也能去除?ProPainter一键视频抠图整合包下载

    ProPainter是一个基于E2FGVI实现的AI视频编辑工具,它结合了增强的传播和Transformer机制,能够快速高效地进行视频修复和水印去除 功能特点 · 对象移除:智能地检测和移除视频中的 ...

  4. Kingbase ES 游标跨事务及其案例一则

    前言 本文介绍游标在PLSQL和SQL层跨事务使用案例,及其案例一则. 本文验证版本: db0=# select version(); db0-# / version ---------------- ...

  5. KingbaseES flashback drop table

    KingbaseES 引入回收站功能,实现drop table操作的数据恢复.回收站功能默认关闭,参数名称:kdb_flashback.db_recyclebin.如果不允许一个删除的表进回收站,需要 ...

  6. 【Java】这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";

    String s1 = "a"; String s2 = s1 + "b"; String s3 = "a" + "b" ...

  7. MySQL联结

    创建联结 mysql> SELECT vend_name,prod_name,prod_price FROM vendors,products WHERE vendors.vend_id=pro ...

  8. 队列(ArrayQueue)

    队列是一种 先进先出(First In First Out,FILO) 的种线性数据结构 . 代码是在动态数组二次封装,先阅读底层实现体验更佳 Array.h 点它 代码清单 #ifndef C___ ...

  9. Luogu P3294 背单词

    观前须知 本题解全部内容遵循CC BY-NC-SA 4.0 Deed原则 更好的观看体验 点这里 笔者的博客主页 正文 Luogu P3294 [SCOI2016]背单词 笔者在刷题的时候看到了这道好 ...

  10. #dp#CodeChef Little Elephant and Mouses

    LEMOUSE 分析 由于被单只老鼠吓到只能算一次,所以前两次走的位置也可能会被老鼠吓到. 设 \(dp[n][m][o][p]\) 表示走到 \((n,m)\) 上一步走的是 \(o\) 这种方式, ...