叽叽歪歪,ca1262,了不起的麦瑟尔女士
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的对象a a.i; //非法,类sample的对象a不能访问类的私有成员i a.j; //非法,类sample的对象a不能访问类的保护成员j a.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;} // 可以访问类中的数据成员i int fun(){ return i; } // 非法,不能直接访问类中的i void main() { myclass ob; ob.init(5); // 给数据成员i赋初值5 ob.show(); i=8; // 非法,不能直接访问类中的i,可改写成ob.i=8 ob.show(); }
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
如何在没有core文件的情况下用dmesg+addr2line定位段错误
用QT制作3D点云显示器——QtDataVisualization
网友评论