对象和类
- 过程性编程和面向对象编程
- 类的概念
- 如何定义和实现类
- 公有类访问和私有类访问
- 类的数据成员
- 类方法(类函数成员)
- 创建和使用类对象
- 类的构造和析构函数
- const成员函数
- this指针
- 创建对象数组
- 类作用域
- 抽象数据类型
面向对象的主要特性:
- 抽象
- 封装和数据隐藏
- 多态
- 继承
- 代码的可重用性
过程性编程和面向对象编程
过程性编程:首先考虑要遵循的步骤,然后考虑要使用的数据。
面向对象编程:首先要考虑数据,也就是编程要面对的实际对象是什么,比如是画一个长方形,这时候我们要以一个长方形作为对象来考虑。首先长方形这个对象包括的数据
有什么,长度和宽度(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;
..............................................
};