第十章:对象和类

对象和类

  • 过程性编程和面向对象编程
  • 类的概念
  • 如何定义和实现类
  • 公有类访问和私有类访问
  • 类的数据成员
  • 类方法(类函数成员)
  • 创建和使用类对象
  • 类的构造和析构函数
  • const成员函数
  • this指针
  • 创建对象数组
  • 类作用域
  • 抽象数据类型

面向对象的主要特性:

  1. 抽象
  2. 封装和数据隐藏
  3. 多态
  4. 继承
  5. 代码的可重用性

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

过程性编程:首先考虑要遵循的步骤,然后考虑要使用的数据。

面向对象编程:首先要考虑数据,也就是编程要面对的实际对象是什么,比如是画一个长方形,这时候我们要以一个长方形作为对象来考虑。首先长方形这个对象包括的数据

有什么,长度和宽度(x, y),然后,对这个长方形可以执行的操作或方法有哪些,比如,设置长度和宽度(set(int x, int y)),重新改变长度和宽度(resize(int x, int y)), 求长方形的

面积( int area(int x, int y) )等等。

最后,将这么数据和方法,全部放在一个类中,也就是描述这个对象的类型。在类中,数据只能被类中的成员函数使用。

面向对象编程,我们始终要遵循的原则是:类定义对象,对象使用方法,方法修改数据。

抽象和类

抽象就是对编程解决的实际问题面对的事物进行抽象。

面向对象程序,就是很多个不同或相同类型的对象之间的交互,通信,沟通。对象的数据(属性)是对外隐藏的,只有成员函数可以使用和修改数据。对象和对象之间的交互,通信,沟通是通过方法(成员函数)这种接口来实现的。

对象对自己的属性隐藏,保护了自己的数据。同时可以通过自身的方法接口与其它对象进行交换。

如何定义和实现类

类就是对数据和操作这些数据的方法的集合。在类声明中,只有这些数据和成员函数(就是对象和其它对象交换的接口)。在类定义中,只是定义了成员函数操作数据的具体实现。

数据声明为private, 数据是隐藏的,只能被方法使用。

方法声明为public,方法是可以被程序使用的。

用Time 类定义对象time1,time2: Time time1; Time time2

类的构造函数和析构函数

因为类中的数据有时候会比较多,当定义了对象之后,我们需要对数据进行赋值或是初始化,这时候我们可以调用成员函数对其进行赋值或是初始化。但是,人为的去调用

一个成员函数去初始化这些数据会显得很臃肿。所以定义了构造函数,它完成的工作就是当创建对象的时候同时对对象进行初始化。

如果定义类的时候不提供构造函数,则编译器会自动提供默认的构造函数,它只是创建对象,不对对象进行初始化工作。

如果人为的定义了类的构造函数,则一定要提供类的默认构造函数,即使不会使用默认的构造函数。

构造函数的使用(一般有这三种方式):

Stock stock1("name", 0.0);

Stock stock2 = Stock("yao", 0.2);//这种方式会产生临时对象,临时对象的值将赋值到Stock2中

Stock * pstock = new Stock("yao", 0.4);

析构函数是当对象过期时,负责对对象进行清理工作。如果构造函数中使用了new分配了内存,则析构函数中要使用delete来释放内存。

构造函数Stock() 对应的析构函数是~Stock()

const 成员函数

只要类方法不修改调用对象,就应该使用const,成为const成员函数

使用方法为, void Stock::show() const 

this 指针

一般情况,类成员函数只涉及到一个对象,即调用它的对象。但有时候会涉及到两个对象,在这种情况下需要使用this指针。

const Stock & topval(const Stock & s) const

函数的意思是比较两个Stock对象,返回值比较大的对象。这个时候如果返回s则是return s.但是如果返回调用这个方法的对象呢???这个时候就应该是 return *this.

第二个const 是指不修改形参,第三个const是指不修改调用这个方法的对象,因为两个对象都是const类型,所以返回对象只能也是const的。

对象数组

类其实就相当于语言中内置的数据类型,如int, long , char等等。所以类就是程序员自己定义的一个抽象的数据类型,相当与是C语言中结构体的升级版本。

类可以定义一个对象,也可以同时定义多个对象,也就是可以定义一个对象数组。

例如:

Stock stocks[10];

Stock stocks[8] = {

Stock("yao1", 0.2);

Stock("yao2", 0.2);

Stock("yao3", 0.2);

};

在第二个定义方式中,首先使用默认构造函数创建数组元素,然后花括号中的构造函数将创建临时对象,然后将临时对象的内容复制到相应的元素中。

因此,要创建类对象数组,必须有默认构造函数。

作用域为类的常量

创建一个由所有对象共享的常量是一个非常好的方法。

第一种方式是在类中声明一个枚举。在类声明中的枚举的作用域为整个类。因此可以用枚举为整型常量提供作用域为整个类的符号常量。

class Stock

{

private:

enum { MAX = 100};

..............................................

};

这种方式声明枚举并不会创建类数据成员。也就是说,所有对象中都不包含枚举。MAX只是一个符号常量,在作用域为整个类的代码中,遇到它时,编译器会用100代替。

在这里只是为了创建符号常量,并不打算创建枚举类型的变量,因此不需要提供枚举名。

第二种方式是使用关键字static

class Stock

{

private:

static const int MAX = 100;

..............................................

};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值