C++编程(6)——类和对象的基本概念(二)

一、类成员的可访问范围

在类的定义中,用下列访问范围关键字来说明类成员可被访问的范围:

  • private:私有成员,只能在成员函数内访问
  • public:公有成员,可以在任何地方访问
  • protected:保护成员,以后再说

以上三种关键字出现的次数和先后次序都没有限制。

定义一个类:

class className {
	private:
		私有属性和函数
	public:
		公有属性和函数
	protected:
		保护属性和函数
};

如果某个成员前面没有上述关键字,则缺省地被认为是私有成员。

class Man {
	int nAge; //私有成员
	char szName[20]; // 私有成员
	public:
		void SetName(char* szName) {
			strcpy(Man::szName, szName);
		}
};

在类的成员函数内部,能够访问:

  • 当前对象的全部属性、函数;
  • 同类其它对象的全部属性、函数。

在类的成员函数以外的地方,只能够访问该类对象的公有成员。

class CEmployee {
private:
	char szName[30]; //名字
public:
	int salary; //工资
	void setName(char* name);
	void getName(char* name);
	void averageSalary(CEmployee e1, CEmployee e2);
};
void CEmployee::setName(char* name) {
	strcpy(szName, name); //ok
}
void CEmployee::getName(char* name) {
	strcpy(name, szName); //ok
}
void CEmployee::averageSalary(CEmployee e1,
	CEmployee e2) {
	cout << e1.szName; //ok,访问同类其他对象私有成员
	salary = (e1.salary + e2.salary) / 2;
}
int main()
{
	CEmployee e;
	//strcpy(e.szName, "Tom1234567889"); //编译错,不能访问私有成员
	e.setName("Tom"); // ok
	e.salary = 5000; //ok
	return 0;
}

int main()
{
	CEmployee e;
	strcpy(e.szName, "Tom1234567889"); //编译错,不能访问私有成员
	e.setName("Tom"); // ok
	e.salary = 5000; //ok
	return 0;
}
  • 设置私有成员的机制,叫“隐藏”
  • “隐藏”的目的是强制对成员变量的访问一定要通过成员函数进行,那么以后成员变量的类型等属性修改后,只需要更改成员函数即可。否则,所有直接访问成员变量的语句都需要修改。

二、“隐藏”的作用

       如果将上面的程序移植到内存空间紧张的手持设备上,希望将szName 改为 char szName[5],若szName不是私有,那么就要找出所有类似strcpy(e.szName,"Tom1234567889");这样的语句进行修改,以防止数组越界。这样做很麻烦。
       如果将szName变为私有,那么程序中就不可能出现(除非在类的内部)strcpy(e.szName,"Tom1234567889");这样的语句,所有对 szName的访问都是通过成员函数来进行,比如:e.setName( “Tom12345678909887”);
       那么,就算szName改短了,上面的语句也不需要找出来修改,只要改 setName成员函数,在里面确保不越界就可以了。

用struct定义类

struct CEmployee {
	char szName[30]; //公有!!
public:
	int salary; //工资
	void setName(char* name);
	void getName(char* name);
	void averageSalary(CEmployee
		e1, CEmployee e2);
};

和用"class"的唯一区别,就是未说明是公有还是私有的成员,就是公有

三、成员函数的重载及参数缺省

  • 成员函数也可以重载
  • 成员函数可以带缺省参数
#include <iostream>
using namespace std;

class Location {
private:
	int x, y;
public:
	void init(int x = 0, int y = 0);
	void valueX(int val) { x = val; }
	int valueX() { return x; }
};

void Location::init(int X, int Y)
{
	x = X;
	y = Y;
}

int main() {
	Location A, B;
	A.init(5);
	A.valueX(5);
	cout << A.valueX();
	return 0;
}
class Location {
private:
	int x, y;
public:
	void init(int x = 0, int y = 0);
	void valueX(int val = 0) { x = val; }
	int valueX() { return x; }
};
Location A;
A.valueX(); //错误,编译器无法判断调用哪个valueX

本文内容为慕课笔记:
中国大学慕课北京大学郭炜老师所讲的C++面向对象程序设计

如有错误或者不足之处,欢迎大家留言指正!