Qt图形界面编程入门(1)

一、类和对象

1,面向过程程序设计(自顶向下设计)

分析出解决问题所需的步骤,然后用函数把这些步骤一一实现,使用的时候一个一个调用

过程式设计对于比较复杂的问题,或是在开发中需求变化比较多的时候,往往显示力不从心

·  这是因为过程式的设计是自上而下的,这要求设计者在一开始就要对需要解决的问题有一定的了解。在问题比较复杂的社会,要做到做一点会比较困难。

·  开发一个系统的过程往往也是一个对系统不断了解和学习的过程,而过程式的设计方法忽略了这一点。

·  过程式设计使用函数定义操作;使用变量定义事物的属性、特征;这样做的结果是数据和操作被分离。

·  比如go()函数表示汽车前进,而汽车的排量、燃料种类等等都是和go()函数分离的。

·  数据和操作被分离,容易导致对一种数据的操作分布在整个数据的各个角落,从而造成系统维护困难。系统越大情况越糟糕。

2,面向对象程序设计

·  面向对象从问题的一部分入手,把构成问题的事物分解成许多对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物自身及其在整个解决问题的过程中的行为。

·  C++语言中,对象抽象成类,类成为模块化元素,是划分程序的基本单位。

·  类将对象的数据和操作(成员函数)封装在一起,可以说这就是对象设计方法最基本的特征。

问题

现在将一批鸭子用若干个盒子包装起来。将这一过程用程序表现出来。

面向过程的设计方法:

涉及到三个操作,对应三个函数:

  ①open() 把盒子打开,目标是得到打开的盒子

  ②put()把鸭子装进去,目标是得到里面装着鸭子的盒子

  ③close()把盒子盖好,目标是获得盖好盒盖的有鸭子的盒子

定义问题中的数据:

用数字state[]表示盒子的状态,state[k]表示第k个盒子的情况。可将盒子状态分为4种情况(用0-3表示):

0-----未开盖的空盒

1------开盖的空盒

2-------装好鸭子、未盖好盖子的盒子

3-------装好鸭子并盖好盖子的盒子

duckState[] 表示鸭子的状态,duckState[n]表示第n只鸭子的情况。

鸭子的状态是未被装入已被装入两种,因此可以用bool类型数组表示。

int open(int state[],int k)打开第k个盒子,成功返回编号,失败返回-1

int put(int state[],int k,bool duckState[],n)将第n只鸭子放入第k个盒子,成功则返回盒子编号,失败返回-1

void close(int state[],int k)将第k个盒子盖好

至此,三个步骤都用函数实现了,感觉还行,下面我们看看面向对象的方法

面向对象的分析设计方式

面向对象的方法不是从“怎么做”出发,而是从“是什么”出发考虑问题。首先寻找问题中的对象。为了发现对象,要在系统说明的文档中查找名词。

在问题中,我们可以找到重要的名词:盒子,鸭子

然后将这些对象的共有特性以及其责任抽象称为特殊的数据类型------类

在C++中,类用class定义

考察盒子对象,显然“状态”是盒子的属性,可以把“将鸭子放入盒子中”归纳为盒子的任务。

为了完成把鸭子装进盒子的任务,需要做三个动作:

打开盖子,装入,合上盖子。每个导致对应类的一个成员函数。

这样一来,我们要做的是对某个盒子发出指令:

①k号盒子,请把盖子打开

②k号盒子,请把第n只鸭子放入

③k号盒子,请把盖子盖上

每个指令计算调用一个成员函数。

盒子类可定义如下:

class BOX{int ID;                          //盒子编号,为什么不是数组?int state;                       //盒子状态,为什么不是数组?int open();                      //打开盒子,为什么没有参数?int put(bool duckState[],n);     //将第n只放入盒子void close();                    //将盖子盖好,为什么没有参数?
}

放入物品的过程中盒子b[k]应当执行如下代码:

b[k].open()
b[k].put(duckState,n);
b[k].close()

·  在面向过程的方法中,数据和函数是分离的,数据可能散落在程序的各个角落,不易维护;

   而面向对象的方法中,函数和数据结合在一起,每个对象都有自己独立的数据,含义清晰,易于维护。

·  在面向过程方法过程中,需要在开始阶段就分析清楚每个过程的作用,并编写合适的函数,一旦在后续工作中发现初始的分析不恰当,则可能改动很大;而面向对象的设计方法允许开发者从问题的局部开始,先找出类,在找出类之间的关系,在开发过程中逐步加深对系统的理解

如何声明一个类

class 类名  // class是声明类的关键字

{

private:

//私有成员数据(属性)和私有成员函数(方法)

protected:

//保护成员数据(属性)和保护成员函数(方法)

public:

//公有成员数据(属性)和公有成员函数(方法)

};

//花括号内部分是类体。类声明以分号结尾。

声明一个银行账户类

class Account
{
public:  // 公有成员int ID  // 账户IDchar Name[20];  //姓名float balance; //余额int withdraw(float m) //取出数量为m的钱{if(balance > m){balance = balance - m; return 1;}else return -1;}void deposits(float m);
};
void Account::deposits(float m){     //在类内部或外部实现函数都可balance = balance + m;
}

声明具体对象或对象数组

正如“人”是抽象的定义,生活的舞台都是具体等等张三,李四在表演;

“账户”类也是抽象的,只有定义了具体账户,才能执行某些操作。

定义一个账户对象:

Account my Account;

而下面语句则定义了包含10个对象的数组:

Account account[10]

不论是定义一个对象,还是一组对象,C++都会在内存中为每一个对象分配必要的空间

公有函数的使用方法

格式:

对象名.函数名(实际参数)

比如,要向myAccount存入600元,格式如下:

myAccount.deposit(600.0)

注意:仅仅对公有函数可以这样使用

类对象的公有变量也直接修改或显示。比如:

myAccount.ID = 10001;  //设定账户ID

同类对象之间可以赋值比如下面的语句:

myAccount = account[0];

·  类也可以作为一个函数的参数或返回值出现,下面定义一个不属于任何类的函数:

//从账户A转m元到账户B
bool transfer(Account A , Account B, float m){if(A.withdraw(m) == 1){  //若A取款成功B.deposits(m);        //向B存款return true;}else return false;
}

注意:调用函数:

transfer(myAccount,account[0],1000.0);

不会修改myAccount和account[0]对象的数值!

原理:

·  虽然函数中A和B出现在参数中,不是在transfer函数体内定义,但A和B仍是此函数内部的局部变量

·  对象myAccount和account[0]分别赋值给A和B(值传递)。这里myAccount和account[0]都是彼此独立的对象

·  在函数中从账户A转m元到账户B。但是myAccount和account[0]对象无任何变化

·  函数transfer执行完毕后,其中的局部变量A和B也随之消失。

解决本问题需要利用指针或引用

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534360.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt图形界面编程入门(2)

二,指针和引用 共同点:它们都代表其他变量占据的某一块内存区,通过指针或引用都可以对他们代表的其他变量进行操作。 以下语句利用指针对变量赋值: int m; int *p; //指针定义 p &m; //将m的内存地址赋给p *p 5;…

Qt图形界面编程入门(3)

公有成员和私有成员 从访问权限上分,类的成员又分为:公有成员(public)、私有成员(private)和保护成员(protected)三类。 公有成员用public来说明。这部分成员可以在程序中通过“…

Qt图形界面编程入门(4)

构造函数和析构函数 构造函数是一个与类同名的特殊的公有成员函数。 创建类对象时构造函数会被调用,且只调用一次/ 构造函数无返回类型。 默认构造函数格式: 类名(){.......} Account(){ //无返回类型,无参数I…

Qt图形界面编程入门(5)

三,继承和多态 继承是定义新类的一种机制,使用这种机制创建新类时只需要声明新类和已创建类之间的差别 对应一个继承关系,创建的新类称为子类,被继承的类称为父类或基类。子类可以使用父类定义的属性和方法,也可以…

tensorflow安装教程

https://note.youdao.com/ynoteshare1/index.html?iddddc63e6a2dfb70605ae9753bcc71a60&typenote 如果失效请下载文件查看: 链接:https://pan.baidu.com/s/15FZETB3rzcpH-LOOpmpjTQ 提取码:6jfm 如果安装包找不到请点击链接提取&am…

TensorFlow深度学习应用开发实战(深度学习简介和开发环境搭建)

一、深度学习的发展及其应用 1.1 深度学习的发展历程 1956年,John McCarthy(约翰麦卡锡)等人在美国达特茅斯学院(Dartmounth College)开会探讨如何使用机器模拟人的智能时,提出了“人工智能”这一概念。 …

路由与交换技术(铺垫内容)

一、OSI参考模型 层次 结构 功能 数据 地址 设备 7 应用层 用户接口 原始文件 主机名 主机 6 表示层 压缩&a…

Python二级笔记(6)

一、知识点 1,continue语句用于中断本次循环的执行,继续执行下一轮循环的条件,表示跳出当前循环;Python中的for、while循环都有一个可选的else语句,如果break语句终止循环,那么else语句将不会执行。 2&am…

瀑布模型、快速原型模型、增量模型、螺旋模型、喷泉模型

一、瀑布模型 1、按照传统的瀑布模型开发软件,有下述几个特点。 ①阶段间具有顺序性和依赖性 阶段间具有顺序性和依赖性,这个特点有两重含义: 1,必须等前一阶段的工作完成之后,才能开始后一阶段的工作;…

Linux基础命令(1)

1.强大好用的Shell Shell是一个命令工具。Shell(也称终端或壳)充当的是人与内核(硬件)之间的翻译官,用户把一些命令“告诉”终端,它会调用相应的程序服务去完成某些工作。 现在红帽系统在内的许多主流Lin…

Python二级笔记(7)

知识点: 1,链式存储结构既可以针对线性结构也可以针对非线性结构,链式存储结构中每个结点都由数据域与指针域两部分组成,增加了存储空间。 2,对象的基本特点:标识唯一性,分类性,多…

Python二级笔记(8)

知识点: 1,栈支持子程序调用。栈上一种只能在一端进行插入或删除的线性表,在主程序调用子函数时要首先保存主程序当前状态,然后转去执行子程序,最终把子程序的执行结果返回到主程序中调用子程序的位置,继续…

软件工程(Rational统一过程)

Rational统一过程(Rational Unified Process,RUP)是由Rational软件公司推出的一种完整而且完美的软件过程。 RUP总结了经过多年商业化验证的六条最有效软件开发经验,这些经验被称为“最佳实践”。 1,最佳实践 (1&am…

软件工程(敏捷过程和极限编程)

1,敏捷过程 为了使软件开发团队具有高效工作和快速响应变化的能力,17位著名的软件专家于2001年2月联合起草了敏捷软件开发宣言。 敏捷软件开发宣言由下述4个简单的价值观声明组成。 (1)个体和交互胜过过程和工具 优秀的团队成…

软件工程(可行性研究讲解)

可行性研究 可行性研究的目的,就是用最小的代价在尽可能短的时间内确定问题是否能够解决。(只是寻找客户所提需求的解决方案,能干还是不能干的问题。) 可行性研究实质上是要进行一次大大压缩简化了的系统分析和设计的过程。 GB…

软件工程(系统流程图讲解)

系统流程图是概括地模型物理系统的工具。 基本符号 系统符号 系统流程图的习惯画法是使信息在图中从顶向下或从左到右流动。 例子 某装配厂有一座存放零件的仓库,仓库中现有的各种零件的数量以及每种零件的库存量临界值等数据记录在库存清单主文件中。当仓库中零…

软件工程(数据流图)

数据流图有4种基本符号: 正方形或(立方体)表示数据的源点或者终点; 圆角矩形(或圆形)代表变换数据的处理; 开口矩形(或两条平行横县)代表数据存储; 箭头表…

网络互联基础(1)

网络互联的基本概念 计算机网络起始于20世纪60年代,当时网络的概念主要是基于主机(Host)架构的低速串行(Serial)连接,提供应用程序执行、远程打印和数据服务功能。IBM的系统网络架构(System Network Architecture,SNA)于非IBM公司的X.25公用…

Python二级笔记(9)

知识点: 1,算法的空间复杂点是指算法在执行过程中所需要的内存空间。 2,结构化程序设计的思想包括:自顶向下、逐步求精、模块化,限制使用goto语句。 3,字典中的“键”可以是整数或者字符串,但…

Python二级笔记(10)

知识点: 1,线性表的链式存储结构中每个结点都由数据域与指针域两部分组成,增加了存储空间,所以一般要多于顺序存储结构。 2,软件测试是为了发现错误而执行程序的过程,测试要以查找错误为中心。 3&#x…