热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php面向对象编程思想,剖析C++的面向对象编程思想

面向对象的程序设计面向对象编程(ObjectOrientedProgramming,OOP,面向对象程序设计)的主要思想是把构成问题的各个事务分解成各个

面向对象的程序设计面向对象编程(Object Oriented Programming,OOP,面向对象程序设计) 的主要思想是把构成问题的各个事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙一个事物在整个解决问题的步骤中的行为。

面向过程就是分析出解决问题所需要的步骤,然后用函数逐步实现,再依次调用就可以了。

面向对象和面向过程是两种不同的编程思想,没有哪一种绝对完美,要根据具体需求拟定开发方案。例如,开发一个小型软件或应用程序,工程量小,短时间内即可完成,完全可以采用面向过程的开发方式,使用面向对象,反而会增加代码量,降低开发效率。

面向过程的编程语言(如C语言)不能创建类和对象,不能用面向对象的思想来开发程序;面向对象的编程语言(如C++、PHP等)保留了面向过程的关键字和语句,仍然可以采用面向过程的思想来开发程序。

面向对象是面向过程的补充和完善。

注意,不要“死磕”概念上的理解,很多有经验的程序员甚至都不能完全解释清楚面向对象和面向过程的区别,要重在实践,不断揣摩编程语言的思想。

类和对象的基本概念

为了方便说明,我们将从现实生活中的实例入手。

我们知道,工业上使用的铸件(电饭锅内胆、汽车地盘、发动机机身等)都是由模子铸造出来的,一个模子可以铸造出很多相同的铸件,不用的模子可以铸造出不同的铸件。这里的模子就是我们所说的“类”,铸件就是我们所说的“对象”。

类,是创建对象的模板,一个类可以创建多个相同的对象;对象,是类的实例,是按照类的规则创建的。

属性和方法

由模子铸造出来的铸件(对象),有很多参数(长度、宽度、高度等),能完成不同的操作(煮饭、承重、保护内部零件等)。这里的参数就是对象的“属性”,完成的操作就是对象的“方法”。

属性是一个变量,用来表示一个对象的特征,如颜色、大小、重量等;方法是一个函数,用来表示对象的操作,如奔跑、呼吸、跳跃等。

对象的属性和方法统称为对象的成员。

类的继承

一个类(子类)可以继承另一个类(父类)的特征,如同儿子继承父亲的DNA、性格和财产。

子类可以继承父类的全部特征,也可以继承一部分,由程序灵活控制。

C++面向对象程序设计举例

这里我们将通过几个简单的例子来演示如何站在面向对象的角度设计程序,以及使用类的好处。

【例】最简单的例子。

#include

using namespace std;

class Time //定义Time类

{

public : //数据成员为公用的

int hour;

int minute;

int sec;

};

int main( )

{

Time t1;//定义t1为Time类对象

cin>>t1.hour;//输入设定的时间

cin>>t1.minute;

cin>>t1.sec;

//输出时间:

cout<

return 0;

}

运行情况如下&#xff1a;

1232 43↙

12:32:43

几点注意&#xff1a;

1) 在引用数据成员hour&#xff0c;minute&#xff0c;sec时不要忘记在前面指定对象名。

2) 不要错写为类名&#xff0c;如写成

Time.hour,Time.minute,Time.sec

是不对的。因为类是一种抽象的数据类型&#xff0c;并不是一个实体&#xff0c;也不占存储空间&#xff0c;而对象是实际存在的实体&#xff0c;是占存储空间的&#xff0c;其数据成员是有值的&#xff0c;可以被引用的。

3) 如果删去主函数的3个输入语句&#xff0c;即不向这些数据成员赋值&#xff0c;则它们的值是不可预知的。

【例】引用多个对象的成员。

1) 程序(a)

#include

using namespace std;

class Time

{

public :

int hour;

int minute;

int sec;

};

int main( )

{

Time t1;//定义对象t1

cin>>t1.hour;//向t1的数据成员输入数据

cin>>t1.minute;

cin>>t1.sec;

cout<

Time t2;//定义对象t2

cin>>t2.hour;//向t2的数据成员输入数据

cin>>t2.minute;

cin>>t2.sec;

cout<

return 0;

}

运行情况如下&#xff1a;

1032 43↙

10:32:43

22 32 43↙

22:32:43

程序是清晰易懂的&#xff0c;但是在主函数中对不同的对象一一写出有关操作&#xff0c;会使程序冗长。为了解决这个问题&#xff0c;可以使用函数来进行输入和输出。见程序(b)。

2) 程序(b)

#include

using namespace std;

class Time

{

public :

int hour;

int minute;

int sec;

};

int main( )

{

void set_time(Time&);//函数声明

void show_time(Time&);//函数声明

Time t1;//定义t1为Time类对象

set_time(t1);//调用set_time函数&#xff0c;向t1对象中的数据成员输入数据

show_time(t1);//调用show_time函数&#xff0c;输出t1对象中的数据

Time t2;//定义t2为Time类对象

set_time(t2);//调用set_time函数&#xff0c;向t2对象中的数据成员输入数据

show_time(t2);//调用show_time函数&#xff0c;输出t2对象中的数据

return 0;

}

void set_time(Time& t) //定义函数set_time&#xff0c;形参t是引用变量

{

cin>>t.hour;//输入设定的时间

cin>>t.minute;

cin>>t.sec;

}

void show_time(Time& t) //定义函数show_time&#xff0c;形参t是引用变量

{

cout<

}

运行情况与程序(a)相同。

3) 程序(c)

可以对上面的程序作一些修改&#xff0c;数据成员的值不再由键盘输入&#xff0c;而在调用函数时由实参给出&#xff0c;并在函数中使用默认参数。将程序(b)第8行以下部分改为&#xff1a;

int main( )

{

void set_time(Time&,int hour&#61;0,int minute&#61;0,int sec&#61;0);//函数声明

void show_time(Time&);//函数声明

Time t1;

set_time(t1,12,23,34);//通过实参传递时、分、秒的值

show_time(t1);

Time t2;

set_time(t2);//使用默认的时、分、秒的值

show_time(t2);

return 0;

}

void set_time(Time& t,int hour,int minute,int sec)

{

t.hour&#61;hour;

t.minute&#61;minute;

t.sec&#61;sec;

}

void show_time(Time& t)

{

cout<

}

程序运行时的输出为&#xff1a;

12:23:34 (t1中的时、分、秒)

0:0:0 (t2中的时、分、秒)

以上两个程序中定义的类都只有数据成员&#xff0c;没有成员函数&#xff0c;这显然没有体现出使用类的优越性。在下面的例子中&#xff0c;类体中就包含了成员函数。

【例】改用含成员函数的类来处理。

#include

using namespace std;

class Time

{

public :

void set_time( );//公用成员函数

void show_time( );//公用成员函数

private : //数据成员为私有

int hour;

int minute;

int sec;

};

int main( )

{

Time t1;//定义对象t1

t1.set_time( );//调用对象t1的成员函数set_time&#xff0c;向t1的数据成员输入数据

t1.show_time( );//调用对象t1的成员函数show_time&#xff0c;输出t1的数据成员的值

Time t2;//定义对象t2

t2.set_time( );//调用对象t2的成员函数set_time&#xff0c;向t2的数据成员输入数据

t2.show_time( );//调用对象t2的成员函数show_time&#xff0c;输出t2的数据成员的值

return 0;

}

void Time::set_time( ) //在类外定义set_time函数

{

cin>>hour;

cin>>minute;

cin>>sec;

}

void Time::show_time( ) //在类外定义show_time函数

{

cout<

}

运行情况与例8.2中的程序(a)相同。

几点注意&#xff1a;

在主函数中调用两个成员函数时&#xff0c;应指明对象名(t1,t2)。表示调用的是哪一个对象的成员函数。

在类外定义函数时&#xff0c;应指明函数的作用域(如void Time∷set_time( ))。在成员函数引用本对象的数据成员时&#xff0c;只需直接写数据成员名&#xff0c;这时C&#43;&#43;系统会把它默认为本对象的数据成员。也可以显式地写出类名并使用域运算符。

应注意区分什么场合用域运算符“∷”&#xff0c;什么场合用成员运算符“.”&#xff0c;不要搞混。

【例】找出一个整型数组中的元素的最大值。这个问题可以不用类的方法来解决&#xff0c;现在用类来处理&#xff0c;读者可以比较不同方法的特点。

#include

using namespace std;

class Array_max //声明类

{

public : //以下3行为成员函数原型声明

void set_value( ); //对数组元素设置值

void max_value( ); //找出数组中的最大元素

void show_value( ); //输出最大值

private :

int array[10]; //整型数组

int max; //max用来存放最大值

};

void Array_max::set_value( ) //成员函数定义&#xff0c;向数组元素输入数值

{

int i;

for (i&#61;0;i<10;i&#43;&#43;)

cin>> array[i];

}

void Array_max::max_value( ) //成员函数定义&#xff0c;找数组元素中的最大值

{

int i;

max&#61;array[0];

for (i&#61;1;i<10;i&#43;&#43;)

if(array[i]> max) max&#61;array[i];

}

void Array_max::show_value( ) //成员函数定义&#xff0c;输出最大值

{

cout<<"max&#61;"<

}

int main( )

{

Array_max arrmax; //定义对象arrmax

arrmax.set_value( ); //调用arrmax的set_value函数&#xff0c;向数组元素输入数值

arrmax.max_value( ); //调用arrmax的max_value函数&#xff0c;找出数组元素中的最大值

arrmax.show_value( ); //调用arrmax的show_value函数&#xff0c;输出数组元素中的最大值

return 0;

}

运行结果如下&#xff1a;

12 12 39 -34 17 134 045 -91 76↙ (输入10个元素的值)

max&#61;134 (输入10个元素中的最大值)

请注意成员函数定义与调用成员函数的关系&#xff0c;定义成员函数只是设计了一组操作代码&#xff0c;并未实际执行&#xff0c;只有在被调用时才真正地执行这一组操作。

可以看出&#xff1a; 主函数很简单&#xff0c;语句很少&#xff0c;只是调用有关对象的成员函数&#xff0c;去完成相应的操作。在大多数情况下&#xff0c;主函数中甚至不出现控制结构(判断结构和循环结构)&#xff0c;而在成员函数中使用控制结构。在面向对象的程序设计中&#xff0c;最关键的工作是类的设计。所有的数据和对数据的操作都体现在类中。只要把类定义好&#xff0c;编写程序的工作就显得很简单了。



推荐阅读
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 给定一个二维平面上的一些点,通过计算曼哈顿距离,求连接所有点的最小总费用。只有任意两点之间有且仅有一条简单路径时,才认为所有点都已连接。给出了几个示例并给出了对应的输出。 ... [详细]
  • 本文介绍了如何将CIM_DateTime解析为.Net DateTime,并分享了解析过程中可能遇到的问题和解决方法。通过使用DateTime.ParseExact方法和适当的格式字符串,可以成功解析CIM_DateTime字符串。同时还提供了关于WMI和字符串格式的相关信息。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
author-avatar
拍友2602882883
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有