OOP第二课
类(class)是面向对象程序设计的最基本的概念,是C++最强有力的特征,是进行封装和数据隐藏的工具,它将一个数据结构与一个操作集紧密地结合起来。类对象是类的实例,用类对象模拟现实世界中的事物比用数据对象更确切。
结构是C的一种自定义的数据类型,它把相关联的数据元素组成一个单独的统一体。
#include <iostream.h>struct Date { int year; int month; int day;};int main(){ Date date1; date1.year=2003; date1.month=8; date1.day=25; cout<<date1.year<<"."<<date1.month<<"." <<date1.day<<endl; return 0;}
类的成员分两部分:一部分对应数据的状态,称为数据成员,另一部分为作用于该数据状态的函数,称为成员函数。
类声明的一般格式如下:
class 类名 {public: 公有数据成员; 公有成员函数;protected: 保护数据成员; 保护成员函数;private: 私有数据成员; 私有成员函数;};
3个关键字: private
、protected
和public
,称为访问权限关键字。每个关键字下面又都可以有数据成员和成员函数。
private
部分称为类的私有部分,这一部分的数据成员和成员函数称为类的私有成员。私有成员只能由本类的成员函数访问,而类外部的任何访问都是非法的。public
部分称为类的公有部分,这部分的数据成员和成员函数称为类的公有成员。公有成员可以由程序中的函数访问,它对外是完全开放的。protected
部分称为类的保护部分,这部分的数据成员和成员函数称为类的保护成员。保护成员可以由本类的成员函数访问,也可以由本类的派生类的成员函数访问,而类外的任何访问都是非法的。private
、protected
和public
三个关键字可以按任意顺序出现任意次。但是,如果把所有的私有成员、保护成员和公有成员归类放在一起,程序将更加清晰。private
处于类体中第一部分时, 关键字private
可以省略。用一个类来描述日期,其形式如下:
class Date {public: void setDate(int y,int m,int d); void showDate();private: int m_year; int m_month; int m_day;};
成员函数的声明通常采用以下两种方式:
即在类的声明中只给出成员函数的原型,而成员函数体写在类的外部。
返回类型 成员函数 (参数列表);
类外定义的一般形式是:
返回类型 类名∷成员函数名(参数表)
{
// 函数体
}
例如, 以下是表示坐标点的类Coord的声明
class Coord {public: void setCoord (int,int); // 设置坐标点 int getx(); // 取x坐标点 int gety(); // 取y坐标点private: int x,y;};void Coord∷setCoord(int a,int b){ x=a; y=b;}int Coord::getx(){ return x;}int Coord::gety(){ return y;}
类的成员函数可以分为内联函数和外联函数。
有两种格式将成员函数声明为类的内联函数:
class Coord{public: void setCoord(int a,int b) { x=a; y=b;} int getx() { return x;} int gety() { retrun y;}private: int x,y;};
在类声明中只给出成员函数的原型,而成员函数体写在类的外部。为了使它起内联函数的作用,在成员函数返回类型前冠以关键字“inline”。
这种成员函数在类外定义的一般形式是:
inline 返回类型 类名::成员函数名(参数表)
{
// 函数体
}
class Coord{public: void setCoord(int,int); int getx(); int gety();private: int x,y;};inline void Coord::setCoord(int a,int b){ x=a; y=b;}inline int Coord::getx(){ return x;}inline int Coord::gety(){ return y; }
inline void Coord:: setCoord(int ,int);// 不能说明这是一个内联函数
class Date{public: void showDate();private: int year; int month; int day;};inline void Date::showDate(){cout<<year<<'.';<<month<<'.'<<day<<endl;}
通常我们把具有共同属性和行为的事物所构成的集合叫做类。
在C++中,可以把相同数据结构和相同操作集的对象看成属于同一类。
在C++中,类也是一种用户自定义数据类型,类的对象可以看成是该类类型的一个实例,定义一个对象和定义一个变量相似。类与对象间的关系,可以用数据类型int和整型变量i之间的关系类比。
C++把类的变量叫做类的对象,对象也称为类的实例。
对象的定义, 也称对象的创建
在C++中可以用以下两种方法定义对象:
class Coord {public: void setCoord(int,int); int getx(); int gety();private: int x,y;} op1,op2;
class Coord { //…};// …main(){ Coord op1,op2; // …}
当定义了一个类的对象后,就可以访问对象的成员了。在类的外部可以通过类的对象对公有成员进行访问,访问对象成员要使用操作符“.”。
访问的一般形式是:
其中“.”叫做对象选择符,简称点运算符。
#include<iostream.h>class Coord {public: void setCoord(int a,int b) { x=a; y=b; } int getx() { return x; } int gety() { return y; }private: int x,y;};void main(){ Coord op1,op2; int i,j; op1.setCoord(5,6); // 调用op1的setCoord(),初始化对象op1 op2.setCoord(7,8); // 调用op2的setCoord(),初始化对象op2 i=op1.getx(); // 调用op1的getx(),取op1的x值 j=op1.gety(); // 调用op1的gety(),取op1的y值 cout<<"op1 i= "<<i<<" op1 j= "<<j<<endl; i=op2.getx(); // 调用op2的getx(),取op2的x值 j=op2.gety(); // 调用op2的gety(),取op2的y值 cout<<"op2 i= "<<i<<" op2 j= "<<j<<endl;}
void main( ){ Date date1; date1.setDate(2006,9,21); //……}
#include <iostream.h>class Date {public: void setDate(int y,int m,int d); void showDate();private: int year; int month; int day;};void Date∷setDate(int y,int m,int d){ year=y; month=m; day=d;}inline void Date∷showDate(){ cout<<year<<"."<<month<<"."<<day<<endl;}void main(){ Date date1,date2; cout<<"Date1 set and output:"<<endl; date1.setDate(1998,4,28); cout<<date1.year<<"."<<date1.month<<"."<<date1.day<<endl; //错误 date1.showDate(); cout<<"Date2 set and output: "<<endl; date2.setDate(2002,11,14); cout<<date2.year<<"."<<date2.month<<"."<<date2.day<<endl; //错误 date2.showDate();·}
void main( ){ Date *date3; date3->setDate(2001,8,15); //……}
类成员有三种访问属性:公有(public)、 私有(private) 和保护(protected) 。
类的成员对类对象的可见性和对类的成员函数的可见性是不同的。
类的成员函数可以访问类的所有成员,而类的对象对类的成员的访问是受类成员的访问属性的制约的。
class Sample{public: int k; int geti(){return i;} int getj(){return j;}int getk(){return k;}private: int i;protected: int j;};//……Sample a; //定义类Sample的对象aa.i; //非法,类Sample的对象a不能访问类的私有成员ia.j; //非法,类Sample的对象a不能访问类的保护成员ja.k; //合法,类Sample的对象a能访问类的公有成员k//……
一般来说,公有成员是类的对外接口,而私有成员和保护成员是类的内部数据和内部实现,不希望外界访问。
将类的成员划分为不同的访问级别有两个好处:一是信息隐蔽,即实现封装;二是数据保护,即将类的重要信息保护起来,以免其它程序不恰当地修改。
两个同类型的变量之间可以相互赋值。同类型的对象间也可以进行赋值,当一个对象赋值给另一个对象时,所有的数据成员都会逐位拷贝。
#include<iostream.h>class abc{public: void init(int i,int j) { a=i; b=j; } void show(){ cout<<a<<" "<<b<<endl; }private: int a,b;};main(){ abc o1,o2; o1.init(12,34); o2=o1; // 将对象o1数据成员的值赋给对象o2 o1.show(); o2.show(); return 0;}
所谓类的作用域就是指在类声明中的一对花括号所形成的作用域。
# include<iostream.h>class myclass{public: int i; void init(int); void show(){ cout<<“i=” <<i<<endl;} // 可以访问类中的数据成员i};void myclass::init(int si){ i=si;} // 可以访问类中的数据成员iint fun(){ return i; } // 非法,不能直接访问类中的ivoid main(){ myclass ob; ob.init(5); // 给数据成员i赋初值5 ob.show(); i=8; // 非法,不能直接访问类中的i,可改写成ob.i=8 ob.show();}
联系客服