面向对象的程序设计方法:
- 将某类客观事物共同特点(属性)归纳出来,形成一个数据结构(可以用多个变量描述事物的属性);
- 将这类事物所能进行的行为也归纳出来,形成一个个函数,这些函数可以用来操作数据结构(这一步叫“抽象”)。
- 然后,通过某种语法形式,将数据结构和操作该数据结构的函数“捆绑”在一起,形成一个“类”,从而使得数据结构和操作该数据结构的算法呈现出显而易见的紧密关系,这就是“封装”。
- 面向对象的程序设计具有“抽象”,“封装”,“继承”,“多态”四个基本特点。
类的定义
类成员的可访问范围
在类的定义中,用下列访问范围关键字来说明类成员可被访问的范围:
- private: 私有成员,只能在成员函数内访问
- public: 共有成员,可以在任何地方访问
- protected: 保护成员
class ClassName
{
私有属性和函数 // 默认是私有的
private:
私有属性和函数
public:
共有属性和函数
protected:
保护属性和函数
}
- 如果某个成员前面没有上述关键字,则缺省地被认为是私有成员。
- 在类的成员函数内部,能够访问:
- 当前对象的全部属性、函数;
- 同类其他对象的全部属性、函数。
- 在类的成员函数以外的地方,只能够访问该类对象的公有成员。
- 设置私有成员的机制,叫“隐藏”
类的成员函数和类的定义可以分开写
class CRectangle
{
public:
int w, h;
int Area() {
return w * h;
}
int Perimeter(){
return 2 * (w + h);
}
void Init(int w_, int h_) {
w = w_;
h = h_;
}
}; //必须有分号
class CRectangle
{
public:
int w, h;
int Area(); // 成员函数尽在此处声明
int Perimeter();
void Init(int w_, int h_);
}; //必须有分号
int CRectangle::Area()
{
return w * h;
}
int CRectangle::Perimeter()
{
return 2 * (w + h);
}
int CRectangle::Init(int w_, int h_)
{
w = w_;
h = h_;
}
使用类的成员变量和成员函数
- 用法1:对象名.成员名
CRectangle r1,r2;
r1.w = 5;
r2.Init(5,4);
- 用法2:指针->成员名
CRectangle r1,r2;
CRectangle * p1 = & r1;
CRectangle * p2 = & r2;
p1->w = 5;
p2->Init(5,4);
- 用法3:引用名.成员名
CRectangle r2;
CRectangle & rr = r2;
rr.w = 5;
rr.Init(5,4);
成员函数的重载及参数缺省
- 成员函数也可以重载
- 成员函数可以带缺省参数
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; } // 函数重载
};
- 使用缺省函数要避免有函数重载时的二义性
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(); // 编译错误 call of overloaded 'valueX()' is ambiguous