C++面向对象程序设计教程-陈维兴 第三章:类和对象

 


类(class)是 C+ + 的精华, 是 C + + 最重要的特征, 是进行封装和数据隐藏的工具。它将一个数据结构与一个操作集紧密地结合起来。类对象是类的实例, 用类对象模拟现实世界中的事物比用数据对象更确切。本章介绍有关类和对象的基本概念和使用方法。

3 .1 类与对象的基本概念

3 .1 .1 结构与类

1 . 结构的扩充结构是 C 语言的一种自定义的数据类型, 在结构体中可以含有各种不同类型的数据。C + + 语言对结构类型进行了扩充, 它不仅可以含有不同类型的数据, 而且还可以含有函数。例如下面声明了一个复数的结构:

 

struct complex {
	double real; // 复数的实部
	double imag; // 复数的虚部
	void init(double r, double i) // 给 real 和 imag 赋初值
	{ 
		real = r; imag = i; 
	}
		double realcomplex() // 求复数的实部值
	{ return real; }
		double imagcomplex() // 求复数的虚部值
	{ return imag; }
		double abscomplex() // 求复数的绝对值
	{
		double t;
	t = real * real + imag * imag;
	return sqrt(t); }
};

在这个声明为 complex 的结构中, 含有两个双精度数据 real 和 imag, 分别代表复数的实数部分和虚数部分,
另外含有四个属于结 构 complex 的函数: init ( )、realcomplex ( )、imagcomplex( )和 abscomplex( )。
init ( )函数用于给 real 及 imag 赋初值, realcomplex( )、imagcomplex( )和 abscomplex ( ) 三个函数 分别用于 计算该复 数的实部 值、虚部值和 绝 对值。

结构中的数据和函数都是结构的成员,分别称作数据成员和函数成员。
在 C + + 中,通常把 函 数 成 员 称 为 成 员 函 数。 在 这 个 结 构 中, real 和 imag 是 数 据 成 员, init ( )、realcomplex( )、imagcomplex()和 abscomplex()是成员函数。为了访问这些成员函数,必须定义该结构类型的变量,然后像访问结构中的数据成员一样进行访问。以下是这个例子的完整程序。

 

//例 3 .1
# include < iostream >
# include < cmath >
using namespace std;
struct complex {
	double real; // 复数的实部
	double imag; // 复数的虚部
	void init(double r, double i) { // 给 real 和 imag 赋初值
		real = r; imag = i;
	}
	double realcomplex() { // 求复数的实部值
		return real;
	} 
	double imagcomplex(){ // 求复数的虚部值
		return imag; 
	}
	double abscomplex() { // 求复数的绝对值
		double t;
		t = real * real + imag * imag;
		return sqrt(t);
	}
} A;
int main()
{
	A.init(1.1, 2.2);
	cout << "real of complex A = " << A.realcomplex()<< endl;
	cout << "imag of complex A = " << A.imagcomplex() << endl;
	cout << "abs of complex A = " << A.abscomplex() << endl;
	return 0;
}
程序运行结果如下:
real of complex A = 1 .1
imag of complex A = 2 .2
abs of complex A = 2 .459675

在 C + + 中,一个结构的成员通常分为两类:私有成员(private)和公有成员(public)。
私有成员(包括数据和函数)只能被该结构中的其它成员访问,而公有成员(包括数据和函数)既可被结构内其它成员访问,也可被结构外的其它部分访问。例如在例 3 .1 中, 变量real 和 imag 只需要被该结构的成员函数访问, 则可声明为私有成员; 四个成员函数需要在结构体外被调用,则可声明为公有成员。因此, 结构 complex 可以改写为:

 

struct complex {
private:
	double real; // 复数的实部
	double imag; // 复数的虚部
public:
	void init(double r, double i) { // 给 real 和 imag 赋初值
		real = r; imag = i;
	}
	double realcomplex() { // 求复数的实部值
		return real;
	} 
	double imagcomplex(){ // 求复数的虚部值
		return imag; 
	}
	double abscomplex() { // 求复数的绝对值
		double t;
		t = real * real + imag * imag;
		return sqrt(t);
	}
};

C + + 规定, 在缺省情况下,结构中的成员是公有的, 因此例 3 .1 结构 complex 中的成员都是公有的。

2 . 类的声明
C + + 提供了一种比结构类型更安全有效的数据类型———类。类是 C + + 的一个最重要的特性。类与结构的扩充形式十分相似,其一般形式如下:

class 类名{
private:
私有数据成员和成员函数
public:
公有数据成员和成员函数
};

其中:class 是声明类的关键字, 类名是要声明的类的名字; 后面的花括号表示出类的声明范围;最后的分号表示类声明结束

类的声明内容包括数据和函数。类中的数据和函数都是类的成员, 分别叫做数据成员和成员函数。与结构的扩充形式一样,类的成员也分为私有成员和公有成员。

私有成员用 private说明,private 下面的每一行,不论是数据成员还是成员函数, 都是私有成员。私有成员只能被该类的成员函数访问,这是 C + + 实现封装的一种方法, 即把特定的成员定义为私有的,就能严格地控制对它的访问。

公有成员用 public 说明,public 下面的每一行都是公有成员。公有成员可被程序中的其它函数访问, 它们是类的对外接口。例如, 前面的结构complex 可以用类改写如下:

 

class complex {
private:
	double real;
	double imag;
public:
	void init(double r, double i)
	{
		real = r; imag = i;
	}
	double realcomplex()
	{
		return real;
	}
	double imagcomplex()
	{
		return imag;
	}
	double abscomplex()
	{
		double t;
		t = real * real + imag * imag;
		return sqrt(t);
	}
};

实际上,在 C+ + 中, 类 class 和结构 struct 是类似的, 因为 C + + 的结构与类一样, 都含有数据以及对这些数据进行的操作。它们的主要区别是缺省值不同:

在类中, 缺省时成员是私有的; 而在结构中,缺省时成员是公有的。如果使用类, 则例 3 .1 的程序可以改写如下:

 

//例 3 .2
# include <iostream >
# include < math.h >
using namespace std;
class complex {
private:
	double real;
	double imag;
public:
	void init(double r, double i)
	{
		real = r; imag = i;
	}
	double realcomplex()
	{
		return real;
	}
	double imagcomplex()
	{ 
		return imag; 
	}
	double abscomplex()
	{
		double t;
		t = real * real + imag * imag;
		return sqrt(t);
	}
} A;
int main()
{
	A.init(1.1, 2.2);
	cout << "real of complex A = " << A.realcomplex() << endl;
	cout << "image of complex A = " << A.imagcomplex() << endl;
	cout << "abs of complex A = " << A.abscomplex() << endl;
	return 0;
}

可以看出,类和结构的功能基本上相同。那么在 C + + 中为什么要用类代替结构呢 ?原因是,在缺省的情况下, 类成员是私有的, 类提供了缺省的安全性。这一规定符合面向对象思想中数据隐藏的准则。数据隐藏使得类中的成员比一般的局部变量得到更好的保
护。

说明:
(1) 类的声明中的 private 和 public 两个关键字可以按任意顺序出现任意次。但是,如果把所有的私有成员和公有成员归类放在一起, 程序将更加清晰。并且应该养成把所有的私有成员放在公有成员前面的习惯,因为一旦用户忘记了使用说明符 private, 由于缺
省值是 private, 这将使用户的数据仍然得到保护。
(2) 除了 private 和 public 之外, 类中的成员还可以用另一个关键字 protected 来说明。被 protected 说明的成员称为保护成员, 它不能被外部函数使用, 但可以通过其它方法使用它,将在第 4 章详细地介绍此方面内容。
(3) 数据成员可以是任何数据类型,但是不能用自动(auto)、寄存器(register)或外部(extern)进行说明。
(4) 不能在类的声明中给数据成员赋初值, 例如:
class abc{
private:
char a =′q′; f / / 错误
int b = 33; / / 错误
public:

};
C + + 规定, 只有在类对象定义之后才能给数据成员赋初值。

 3 .1 .2 成员函数的定义

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值