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. 文旅新体验!3DCAT助力广州非遗“元宇宙”街区炫酷亮相

    2022年6月12日,2022年"文化和自然遗产日"广州非遗宣传展示主会场暨广州非遗街区(北京路)开街仪式在南越王博物院(王宫展区)举行. 本次活动由广州市文化广电旅游局主办,广州 ...

  2. MappedByteBuffer VS FileChannel:从内核层面对比两者的性能差异

    本文基于 Linux 内核 5.4 版本进行讨论 自上篇文章<从 Linux 内核角度探秘 JDK MappedByteBuffer> 发布之后,很多读者朋友私信我说,文章的信息量太大了, ...

  3. Scala 类型检查和转换

    (1)obj.isInstanceOf[T]:判断 obj 是不是 T 类型. (2)obj.asInstanceOf[T]:将 obj 强转成 T 类型. (3)classOf 获取对象的类名. 1 ...

  4. Scala变量和常量的声明

    标示符的命名规则 1. 字母或下划线开头 2. 以操作符开头,且只包含操作符(+ - * / # !等) 3. 用反引号`....`包括的任意字符串,即使是 Scala 关键字(39 个)也可以• p ...

  5. Python BeautifulSoup 简单使用方法

  6. Python---flask框架实现修改密码功能

    数据库部分: 1 #重置密码 2 def reset_pass(phone,password): 3 conn,cursor=get_conn() 4 sql="update userdat ...

  7. 创业:大模型RAG系统三个月的开发心得和思考

    1. 前言 自从和员外上家公司离职后,我们就自己搞公司投入到了RAG大模型的AI产品应用的开发中,这中间有一个春节,前后的总时间大概是三个月左右,在这三个月期间,基本是昼夜兼程啊,到今天3月底结束,产 ...

  8. C#数据去重的5种方式,你知道几种?

    前言 今天我们一起来讨论一下关于C#数据去重的的5种方式,每种方法都有其特点和适用场景,我们根据具体需求选择最合适的方式.当然欢迎你在评论区留下你觉得更好的C#数据去重的方式. 使用HashSet去重 ...

  9. #dp,高精度#洛谷 4295 [SCOI2003]严格N元树

    题目 求有多少棵严格 \(n\) 叉树深度为 \(k\) 分析 考虑往下放子孙挺难维护的,考虑在上面换新的根. 设 \(dp[i]\) 表示深度不超过 \(i\) 的方案数,那么 \(dp[i]=dp ...

  10. #二分图匹配#UVA1194 Machine Schedule

    题目 有两台机器 \(A,B\) 分别有 \(n,m\) 种模式. 现在有 \(k\) 个任务.对于每个任务 \(i\) ,给定两个整数 \(a_i\) 和 \(b_i\)​, 表示如果该任务在 \( ...