中国大学MOOC程序设计与算法(三):C++ 面向对象程序设计 第二周 类和类的对象基础 笔记 之 类和对象的基本概念

第二周 类和类的对象基础
1.类和对象的基本概念(2)
2.构造函数
3.复制构造函数
4.类型转换构造函数和析构函数
5.构造函数析构函数调用时机

1.类和对象的基本概念(2)

类成员的可访问范围

在类的定义中,用下列访问范围关键字来说明类成员可被访问的范围:
– 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;
}

设置私有成员的机制,叫“隐藏”

隐藏”的目的是强制对成员变量的访问一定要通过成员函数进行,那么以后成员变量的类型等属性修改后,只需要更改成员函数即可。否则,所有直接访问成员变量的语句都需要修改。
如果将上面的程序移植到内存空间紧张的手持设备上,希望将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(CEmployeee1,CEmployee e2);
};

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

成员函数的重载及参数缺省
成员函数也可以重载, 成员函数可以带缺省参数。

#include 
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;
}
输出: 5

使用缺省参数要注意避免有函数重载时的二义性

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

你可能感兴趣的:(中国大学MOOC程序设计与算法(三):C++ 面向对象程序设计 第二周 类和类的对象基础 笔记 之 类和对象的基本概念)