C++的对象与类

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

OOP:面向对象编程。
OOP的重要特性:
*抽象(描述问题和解决方案)
*封装和数据隐藏(private定义私有化成员和方法)
*多态
*继承
*代码的可重用性

1.1、过程性编程方法

首先考虑遵循的步骤,然后考虑如何表示这些数据

1.2、面向对象编程方法

首先考虑数据,不仅考虑如何表示数据,还要考虑如何使用数据
从用户的角度考虑对象-描述对象所需的数据和描述用户与数据交互所需的操作。完成对接口的描述后,需要确定如何实现接口和数据存储。

1.3、抽象

抽象是通往用户定义类型捷径,为了描述问题的本质特征,根据特征描述解决方案。
在C++中,用户定义类型指的是实现抽象接口的类设计。(关键字public标识部分组成了类公共接口的类成员)

1.4、C++中的类

类是一种将抽象转化为用户类型的C++工具,它将数据表示和操纵数据的方法组合成一个整洁的包。
一般情况下,类规范由两个部分组成:
a、类声明:以数据成员的方式描述数据部分,以成员函数(方法)的方式描述接口;
b、类方法定义:描述如何实现类成员函数。
类设计第一步是提供类声明,类声明提供了类的蓝图,有私有部分和公有部分,包括数据成员和函数成员
第二部是实现类成员函数,使用作用域解析运算符指出成员函数属于哪个类,然后单独提供函数定义。

1.5、类的声明

通常情况下,将接口(类定义)放在头文件中,并将实现(类方法的代码)放在源代码文件中。
类名首字母大写(约定写法),声明包括了公有部分和私有部分的类成员,类成员包括了数据和成员函数。
关键字private和public描述了对类成员的访问控制。

//程序示例   stock00.h
//stock00.h -- Stock class interface
#ifndef STOCK00_H
#define STOCK00_H

#include <string>

class Stock      //class declaration
{
private:
	std::string company;
	long shares;
	double share_val;
	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

1.5.1、公有部分

使用类对象的成员都可以直接访问公有部分,但只能通过公有成员函数(或友元函数)来访问对象的私有部分。因此公有成员函数是程序和类对象的私有成员之间的桥梁,提供了对象和程序之间的接口。

1.5.2、数据隐藏

防止程序直接访问私有化数据。(private关键字标识的部分只能通过公共成员来访问的类成员)。
也可以让开发人员(类的用户)无需了解数据是如何被表示的,只需要知道成员函数接受什么样的参数以及返回什么类型的值
(为了更好的维护程序,程序接口的定义一般不轻易修改,以后只对接口函数调用的实现细节进行优化,这就要求将实现细节从接口设计中分离出来)。

1.5.3、封装

将实现细节放在一起并将他们与抽象分开。所以类设计过程中尽可能将公有接口与实现细节分开。其中公有接口表示设计的抽象组件,数据隐藏(将数据放在类的私有部分中)是一种封装,将实现的细节隐藏在私有部分中,也是一种封装。

1.5.4、控制对成员的访问

无论类的成员是数据成员还是成员函数,都可以在类的公有部分和私有部分中声明。
出于数据隐藏的目的,数据项通常放在私有部分,组成类接口的成员函数放在公有部分,也可以把一部分成员函数放在私有部分中(处理不需要公有接口中的实现细节),公有方法可以使用他们。
类对象的默认访问控制就是private,所以类声明中私有部分也可以省略关键字private,或显式的使用private。对比结构体的默认访问类型是publicl,因为结构只是单纯的表示数据对象。

1.6、类的实现

类描述的第一个部分是声明,第二个部分就是实现:为那些由类声明中的原型表示的成员函数提供代码。
类的成员函数包含函数头和函数体,返回类型和参数,需要注意两点特殊内容:
a、定义成员函数时,需要使用作用域解析运算符::来标识函数所属的类;*
b、类的方法可以访问类的private成员,包括数据和方法。
void Stock::update(double pr)
表示update()函数是Stock类的成员函数。与其他类内同名成员函数无关。

//程序示例 stock00.cpp
// stock00.cpp -- implementing the Stock class
#include <iostream>
#include "stock00.h"

void Stock::acquire(const std::string & co, long n, double pr)
{
	company = co;
	if(n < 0)
	{
		std::out<<"Number of shares can't be negative;"
					<<company<<"shares set to 0.\n";
		shares = 0;
	}
	else
	{
		shares = n;
	}
	share_val = pr;
	set_tot();
}

void Stock::buy(long num, double price)
{
	...
}

void Stock::sell(long nuim, double price)
{
	...
}

void Stock::update(double price)
{
	...
}

void Stock::show()
{
	...
}

1.6.1、内联函数

1、在头文件的类声明中定义的函数都将自动成为内联函数。(优先使用这种简单的方法)
2、在类声明中只明确成员函数的返回类型和函数原型,在类实现部分定义成员函数,但是需要使用inline限定符。

1.6.2、类对象

创建类的对象可以直接声明一个类变量,也可以通过new运算符为对象分配存储空间,可以将对象作为函数的参数和返回值,也可以将一个对象赋值给另一个。
创建的每个类对象都有自己的内存空间,用于存储其内部变量和类成员,但是一个类的私有对象都共享一组类方法,不同类对象调用同一个成员函数时,执行的是一个代码块,只是将这些代码用于不同的数据

1.6.3、客户/服务器模型

面向对象编程通常可以按照客户/服务器模型来讨论程序设计。
客户:使用类的程序。
服务器:类声明(包括了类方法),是程序可以使用的资源。
客户只能通过以公有方式定义的接口使用服务器,客户的唯一责任就是了解该接口,服务器设计人员的责任就是确保服务器根据该接口可靠并准确的执行。另外服务器设计人员只能修改类设计的实现细节,而不能随意修改接口,这样开发人员独立的对客户和服务器进行改进,同时对服务器的修改也不会对客户的行为造成影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值