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++面向对象程序设计
如有错误或者不足之处,欢迎大家留言指正!