C++的学习之旅——对象和类(上)

目录

一、过程性编程和面向对象编程

二、抽象和类

1、类型是什么

2、C++中的类

3、实现类成员函数

4、使用类

(1)创建对象

(2)使用成员函数


一、过程性编程和面向对象编程

过程性编程和面向对象编程是一种软件开发方法,是一种编程范式。它们有个先后顺序,就是先有面向过程,随后是面向对象。

面向过程(Procedure-Oriented Programming ):注重过程,即将一个事情拆分成几个过程,按照顺序,一步一步执行过程。

面向对象(Object-Oriented Programming ):注重对象,即将一个事情中的事物抽象成几个对象,赋给对象一些属性和方法,让每个对象去执行自己的方法,解决问题。

 

采用过程性编程方法时,首先考虑要遵循的步骤,然后考虑如何表示这些数据(并不需要程序一直运行,用户可能希望能够将数据存储在一个文件中,然后从这个文件中读取数据)。

采用 OOP 方法时,首先从用户的角度考虑对象——描述对象所需的数掘以及描述用户与数据交互所需的操作。完成对接口的描述后,需要确定如何实现接口和数据存储。最后,使用新的设计方案创建出程序。

看到一个很好的例子来区分过程性编程和面向对象编程:

问题: 洗衣机里面放有脏衣服,怎么洗干净?

(1)面向过程的解决方法:

1、执行加洗衣粉方法;

2、执行加水方法;

3、执行洗衣服方法;

4、执行清洗方法;

5、 执行烘干方法;

以上就是将解决这个问题的过程拆成一个个方法(是没有对象去调用的),通过一个个方法的执行来解决问题。

(2)面向对象的解决方法:

1、我先弄出两个对象:“洗衣机”对象和“人”对象

2、针对对象“洗衣机”加入一些属性和方法:“洗衣服方法”“清洗方法”、“烘干方法”

3、针对对象“人”加入属性和方法:“加洗衣粉方法”、“加水方法”

4、然后执行

人.加洗衣粉

人.加水

洗衣机.洗衣服

洗衣机.清洗

洗衣机.烘干

解决同一个问题 ,面向对象编程就是先抽象出对象,然后用对象执行方法的方式解决问题。面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
出处:什么是面向对象编程和面向过程编程

二、抽象和类

1、类型是什么

将变量声明为int或float指针时,不仅仅是分配内存,还规定了可对变量执行的操作。指定基本类型完成了三项工作:

①决定了数据对象需要的内存数量

②决定如何解释内存中的位(long和float在内存中占用的位数相同,但将它们转换为数值的方法不同)

③决定可以使用数据对象执行的操作或者方法。

对于内置类型来说,以上相关操作信息被内置到编译器中,但在C++中定义用户自己的数据类型时,必须自己提供这些信息。

2、C++中的类

类是一种将抽象转换为用户定义类型的C++工具,它将数据表示和操纵数据的方法组合成一个整洁的包。

类规范由两个部分组成:

①类声明:以数据成员方式描述数据部分,以成员函数(被称为方法)方式描述公有接口

②类方法定义:描述如何实现类成员函数

类声明提供了类的蓝图,而方法定义提供了细节

下面看一下如何定义类

#ifndef STOCK00_H_
#define STOCK00_H_

#include <string>

class Stock
{
	private:
		std::string company;//公司名称 
		long shares;//公司存储的股票数量 
		double share_val;//每股的价格1 
		double total_val;//股票总价格 
		void set_tot(){total_val=shares*share_val}//计算股票总价格 
	public:
		void acquire(const std::string & co,long n,double pr);
		void buy(long num,double price);
		void sell(long num,double price);
		void update(double price);
		void show();
};
#endif

①一般将接口(类定义)放在头文件,并将实现(类方法的代码)放在源代码文件中

class指出这些代码创建了一个类(与函数模板不同,这里不可以使用typename代替class),Stock代表类的名称,通常首字符大写

③关键字privatepublic也是新的关键字,描述了对类成员的控制。private下的为私有部分,不可以直接访问,public下的为公有部分,可以调用公有部分中的成员函数,公有部分中的成员函数可以使用私有成员中的变量和函数。即公有成员函数是程序和对象之间的桥梁。防止程序直接访问数据被称为数据隐藏。数据项一般放在私有部分,组成类接口的成员函数放在公有部分。此外,C语言还提供了第三个访问关键字protected。后面会介绍

可以不用在类声明中使用关键字private,类对象会默认访问控制。

class Stock
{
		std::string company;//公司名称 
		long shares;//公司存储的股票数量 
		double share_val;//每股的价格1 
		double total_val;//股票总价格 
		void set_tot(){total_val=shares*share_val}//计算股票总价格 
	public:
		void acquire(const std::string & co,long n,double pr);
		void buy(long num,double price);
		void sell(long num,double price);
		void update(double price);
		void show();
}

3、实现类成员函数

创建类还需要为类声明中的原型表示的成员函数提供代码。成员函数定义和常规函数定义相似,也有函数体,函数头,也有返回类型和参数。另外还有两个独特的特征:

①定义成员函数时,使用作用域解析运算符(::)来标识函数所属的类。这样可以在不同类中使用相同的函数名。如:

void Stock::update(double price)//stock类的成员函数
void Buffoon::update(double price)//Buffoon类的成员函数

update()具有类作用域,Stock类的其他成员函数可以不用使用作用域解析运算符,就可以使用update()方法。 

 ②类方法可以访问类的private组件,例如,由于company、shares、shares_val、total_val是类Stock中的私有数据成员,函数show中可以直接使用下面代码

std::cout<<"Company: "<<company
        <<"  Shares:"<<shares<<endl
        <<" Share Price: "<<share_val
        <<"Total Worth : $"<<total_val<<endl;
按照前面的头文件,我们编写在另一个源代码中编写成员函数代码:
#include <iostream>
#include "stock00.h"
/*******************************
*函数名:acquire
*作用:首次购买某公司股票,初始化
*参数:co:公司名字
		n:股票数量
		pr:单股价格
*返回:无
*其他:无
********************************/ 
void Stock::acquire(const std::string & co,long n,double pr)
{
	company=co;
	if(n<0)
	{
		std::cout<<"Number of shares can't be negative;"
				<<company<<"shares set to 0.\n";
		shares=0;
	}
	else 
		shares=n;
	share_val=pr;
	set_tot();
}
/*******************************
*函数名:buy
*作用:购买该公司股票 
*参数:num:股票数量 
		price:单股价格 
*返回:无
*其他:无
********************************/ 
void Stock::buy(long num,double price)
{
	if(num<0)
	{
		std::cout<<"Number of shares purchased can't be negative. "
		<<"Transaction is absorted.\n";
		
	}
	else 
	{
		shares+=num;
		share_val=price;
		set_tot();
	}
}
/*******************************
*函数名:sell
*作用:售卖股票 
*参数:num:股票数量 
		price:单股价格 
*返回:无
*其他:无
********************************/ 
void Stock::sell(long num,double price)
{
	using std::cout;
	if(num<0)
	{
		cout<<"Number of shares sold can't be negative."
		<<"Transaction is aborted.\n";
	}
	else if(num>shares)
	{
		cout<<"You can't sell more than you have."
		<<"Transaction is absorted.\n";
	}
	else 
	{
		shares-=num;
		share_val=price;
		set_tot();
	}
}
/*******************************
*函数名:update
*作用:更新股票价格 
*参数:price:单股价格 
*返回:无
*其他:无
********************************/ 
void Stock::update(double price)
{
	share_val=price;
	set_tot();
}
/*******************************
*函数名:show
*作用:打印数据 
*参数:无 
*返回:无
*其他:无
********************************/ 
void Stock::show()
{
	using namespace std;
	cout<<"Company: "<<company<<endl
	<<" Shares:"<<shares<<endl
	<<" Share Price:$"<<share_val<<endl
	<<" Total Worth:$"<<total_val<<endl;
}

其中,定义位于类声明中的函数都将成为内联函数,如上述的Stock::set_tot()是一个内联函数。类声明常将短小成员函数作为内联函数。当然,也可以在类声明外定义成员函数,在函数定义前使用inline限定符即可使之称为内联函数。

class Stock
{
		....
		void set_tot();//计算股票总价格 
	public:
        ....
}

inline void Stock::set_tot()
{
    total_val=shares*share_vakl;
}

由于内联函数需要在每个使用它们的文件中对其定义,确保可用,通常将内联定义放在定义类的头文件中。

4、使用类

(1)创建对象

在定义好类之后,可以通过类名称创建对象 

Stock kate,joe;//创建名为kate,joe的对象

(2)使用成员函数

可以类似结构一样,使用成员运算符 '.' 使用对象的成员函数

kate.show();//使用kate对象的成员函数
joe.show();//使用joe对象的成员函数

C++的学习笔记持续更新中~

要是文章有帮助的话

就点赞收藏关注一下啦!

感谢大家的观看

欢迎大家提出问题并指正~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IC 1396

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值