计算机程序设计c++ 9-4:私有/公有/保护成员

公有 私有与保护成员的定义

  • 在public:后面定义的数据成员和函数成员都称作公有成员
    • 例如:public: char name[10]; int min(int a, int b);
    • 字符数组name和函数min()都是公有成员
  • 在private:后面定义的数据成员和函数成员都称作私有成员
    • 例如:private: int age; int max(int a, int b);
    • 整数变量age和函数max()都是私有成员
  • 在protected:后面定义的数据成员和函数成员都称作保护成员
    • 例如:protected: float price; int abs(int a);
    • 浮点变量price和函数abs()都是保护成员

公有成员

  • 外界(类外)能够直接访问该成员,通过.运算符

    • 一般函数成员被定义为公有成员
    • 通过调用公有函数成员实施规定的操作
    • 外界与类之间起着接口的作用
  • 例如:钟表类中的设置函数set(int,int,int,float)就定义成公有成员

class Clock
{
	public:
		void set(int h,int m,int s,float p)
		{ //对小时、分钟、秒钟的值进行有效性检验后,再赋值
			Hour = h>=0&&h<=24? h : 0;
			Minute = m>=0&&m<=60? m : 0;
			Second = s>=0&&s<=60? m : 0;
			Price = p;
		}
} ; //分号别忘

Clock XJTU;
XJTU.set(11,23,25,1000);  // 这是允许的

私有成员

  • 外界(类外)不能够直接访问该成员
    • 一般数据成员被定义为私有成员
    • 使得成员被封装隐藏起来,外界不能随便修改对象的私有数据成员
    • 只有通过类中公有函数对数据进行修改,达到数据的安全性

例如:钟表类的时分秒定义为私有成员,通过set()函数才能修改

class Clock
{
	private:
		int Hour, Minute, Second;
		float Price;
	public:
		void set(int h, int m, int s, float p);
} ;

Clock XJTU;
XJTU.Hour=10; // × 这是不允许的

保护成员

  • 外界部分区域能够访问该成员
    • 换句话说某些数据或函数成员在类外被有限制的访问
    • 私有是对外界完全封闭,公有是完全开放,保护是介于两者之间
  • 例如:下面有两个类的定义,一个是时间类,一个是日期类
class time
{
private:
	int hour,minute;
protected:
	int second;
} ;

class date:public time  // 继承
{
	private:
		int year,month,day;
	public:
		void show_date_time()
		{
			cout << year << '-' << month << '-' << day << '\t';
			cout << hour << ':' << minute << ':' << second << endl;  // 这是不允许的,因为hour与minute是time类中的私有成员,不能直接访问。但是second是可以的,因为其是保护成员;
		}
} ;

分数类的抽象描述

例子

  • 数据成员:分子与分母
    • 整型变量:int a,b;
    • 分子、分母定义成公有、私有、保护成员,理论上都可以
    • 但仔细分析,分母不能为0,应该定义成私有成员,以便数据安全控制
    • 分子是任意整数都可以,又不希望外界任意读写,所以定义成保护成员
  • 函数成员:设置数据、输出分数、分数相加、求最大公因数
    • void set(int aa,int bb); //设置分子分母
    • void show(); //显示分数
    • Fraction add(Fraction u); //加一个分数
    • int divisor(int p,int q); //求最大公约数
    • 前三个函数应该定义为公有成员
    • 最后一个函数可以任意定义,本类定义为私有成员

分数类的定义

class Fraction
{
protected:
	int a;  //分子可以定义为保护成员
private:
	int b;  //分母应该定义为私有成员,因为要防止分母为0
	int divisor(int p, int q);  //求最大公约数
public:
	void set(int aa, int bb);  //设置分子分母
	void show();  //显示分数
	Fraction add(Fraction u);  //加分数 返回的是一个类
};

类外定义设置与显示成员函数

//设置分子、分母
void Fraction:: set(int aa,int bb) {
	a = aa;
	if (bb != 0) //分母有效性检验
		b = bb;
	else
	{ 
		a = 0;
		b = 1;
	}
}

//显示分数
void Fraction::show()
{
	cout << a << "/" << b;
}

类外定义公约数成员函数

int Fraction::divisor(int p, int q)
{
	int r;
	if(p < q)  // 让p>q 
	{
		int tmp;
		tmp = p;
		p = q;
		q = tmp;
	}
	r = p % q;
	while(r != 0)
	{
		p = q;
		q = r;
		r = p % q;
	}
	return q;
} 

类外定义相加成员函数

//分数相加,本类对象加u
Fraction Fraction::add(Fraction u)
{
	int tmp;
	Fraction v;
	v.a=a*u.b+b*u.a; //分子 分母相乘作为新的分母,分子对应的相乘相加
	v.b=b*u.b;  //分母
	tmp = divisor(v.a ,v.b); //计算分子、分母的公约数
	v.a=v.a/tmp;//约去公约数
	v.b=v.b/tmp;//约去公约数
	return v; //返回结果
}

Guess you like

Origin blog.csdn.net/uncle_ll/article/details/121367566