目录
2.1 类的定义和使用
在C++中,类的定义方法如下:
class 类名{
访问范围说明符:
成员变量1
成员变量2
...
成员函数声明1
成员函数声明2
访问范围说明符:
更多成员变量
更多成员函数声明
...
};
类的定义要以";"结束。
“范围访问说明符”一共有三种:public、private和protected。“范围访问说明符”可以出现任意多次。
“成员变量”的写法与普通的变量定义相同。称其为成员变量,是因为这些变量是一个类的成员。同样的,“成员函数声明”的写法也与普通的函数声明相同。一个类的成员函数之间可以互相调用。类的成员函数可以重载,也可以设定参数的默认值。
以前所学的函数不是任何类的成员函数,可称为“全局函数”。
成员函数的实现可以位于类的定义之外,格式如下:
返回值类型 类名::函数名()
{
语句组
}
定义类之后,就可以定义对象了。定义对象的基本方法如下:
类名 对象名;
2.2 类的示例程序剖析
分析略(作为复习笔记应较为熟练掌握)。
#include <iostream>
using namespace std;
class CRectangle
{
public:
int w, h; //成员变量,宽和高
void init( int w_,int h_ ); //成员函数,设置宽和高
int area(); //成员函数, 求面积
int perimeter(); //成员函数,求周长
}; //必须有分号
void CRectangle::init( int w_,int h_ )
{
w = w_; h = h_;
}
int CRectangle::area()
{
return w * h;
}
int CRectangle::perimeter()
{
return 2 * ( w + h);
}
int main( )
{
int w,h;
CRectangle r; //r是一个对象
cin >> w >> h;
r.init( w,h);
cout << "It's area is " << r.area() << endl;
cout << "It's perimeter is " << r. perimeter();
cout << sizeof(CRectangle) << endl;
return 0;
}
2.3 访问对象的成员
除了前面提到的“对象名.成员名”方法,还可以用“指针->成员名”的方式来访问对象的成员。例如:
CRectangle r1, r2;
CRectangle* p1 = &r1;
CRectangle* p2 = &r2;
p1->w = 5; //此处的w属于p1指向的对象
p2->init(5, 4); //init函数作用在p2指向的对象上
还可以用“引用名.成员名”的方式访问对象的成员。例如:
CRectangle r2;
CRectangle & rr = r2;
rr.w = 5;
rr.init(5, 4); //rr的值改变,r2的值也改变
调用类的成员函数时,必须指明其所作用的对象。
类还有另外一种写法,就是将class关键字换成struct。没有成员函数的struct还是称作“结构”,结构变量不是对象;有成员函数的struct就是类。写成struct的类和写成class的类只在类成员的可访问范围方面有一点很小的差别,后面很快会提到。
和结构变量一样,对象之间可以用“=”互相赋值,但不能用“==”、“!=”、“<”、“>”、“<=”、“>=”进行比较运算,除非这些运算符经过适当的“重载”(见第4章)。
2.4 类成员的可访问范围
2.4.1 private和public访问范围说明符
在类的定义中,可以用private、public和protected三种关键字来指定成员可被访问的范围。
private:用来指定私有成员。一个类的私有成员,不论是成员变量还是成员函数,都只能在该类的成员函数内部才能被访问。
public:用来指定公有成员。一个类的公有成员在任何地方都可以被访问。
protected:用来指定保护成员。这需要等介绍“继承”之后再解释。
三种关键字出现的次数和先后次序都没有限制。成员变量的可访问范围由离它前面最近的那个访问范围说明符决定。如果某个成员前面没有访问范围说明符,则对class来说,该成员默认地被认为是私有成员;对struct来说,该成员默认地被认为是公有成员。
2.4.2 “隐藏”的作用
设置私有成员的机制叫做“隐藏”。“隐藏”的一个目的就是强制对成员变量的访问一定要通过成员函数进行。这样做的好处是,如果以后修改的成员变量的类型等属性,只需要更改成员函数即可;否则,所有直接访问成员变量的语句都需要被修改。
“隐藏”机制还可以避免对对象的不正确操作。有点成员函数只是设计用来让同类的成员函数调用的,并不希望对外开放,因此就可以将它们声明为私有的,隐藏起来。在设计类的时候,应当尽可能隐藏使用者不需要知道的实现细节,只留下必要的接口(即一些成员函数)来对对象进行操作,这样能够避免类的使用者随意使用成员函数和成员变量而导致错误。
注:原书“2.1 结构化程序设计的不足”与“2.2 面向对象程序设计的概念和特点”涉及编程思路,作者目前水平有限,对此感悟理解不到位,故暂不整理。