第三章 类和对象
1 第三章 类和对象
31类与对象的基本概念 311结构与类 1.结构的扩充 C++中对C语言的结构类型进行了扩充,它还可以含有函数。如: struct complex( double real ∥复数的实部 double imag ∥复数的虚部 void init( double r, double D)∥给real和imag赋初值 freal=r; imag=i;) double realcomplexo 取复数的实部值 freturn real double imagcomplexo ∥取复数的虚部值 freturn imag double abscomplexo ∥求复数的绝对值 i double t trealreal+imag * imag return agrt(t); };结构类型中的数据和函数,分别称为数据成员和函数成员
2 3.1 类与对象的基本概念 3.1.1 结构与类 1. 结构的扩充 C++中对C语言的结构类型进行了扩充,它还可以含有函数。如: struct complex{ double real; //复数的实部 double imag; //复数的虚部 void init (double r, double I) //给real和imag赋初值 { real=r; imag=i; } double realcomplex() //取复数的实部值 { return real;} double imagcomplex() //取复数的虚部值 { return imag;} double abscomplex() //求复数的绝对值 { double t; t=real*real+imag*imag; return agrt(t); } };结构类型中的数据和函数,分别称为数据成员和函数成员
※例3.1 void maino #include <iostre( A init(1. 1, 2.2) lud< th cout<“复数A的实部=“<< A. realcomplex(0<endl struct complex!/cou<“复数A的实部 double res “< A. imagcomplex(<end cou<“复数A的绝对值 double im -"<<A.abscomplexO<<endl void init( freal-r; iag I, double realcomplexo ∥取复数的实部值 freturn real; double imagcomplexo 取复数的虚部值 freturn imag; 1 double abscomplexo ∥复数的绝对值 i double t t=realrealtimag imag; return sqrt(t) 3:
3 **例 3.1 #include #include struct complex{ double real; //复数的实部 double imag; //复数的虚部 void init (double r, double I) //给real和imag赋初值 { real=r; imag=i; } double realcomplex() //取复数的实部值 { return real;} double imagcomplex() //取复数的虚部值 { return imag;} double abscomplex() //求复数的绝对值 { double t; t=real*real+imag*imag; return sqrt(t); } } A; void main() { A.init(1.1,2.2); cout<<“复数A的实部= “<<A.realcomplex()<<endl; cout<<“复数A的实部 = “<<A.imagcomplex()<<endl; cout<<“复数A的绝对值 = “<<A.abscomplex()<<endl; }
2.类的定义(声明) C++中说明类的一般形式为 cisaa 类名{ private:(可缺省) 私有数据成员和函数成员 rotected 保护段 public 公有数据成员和函数成员 类 class和结构 sturct的主要区别是 class complex 在缺省 private时 private 在类中,成员是私有的 double real, imag; 在结构中,成员是公有的 public void init(double r, doubleireal-r; imagi;) double realcomplexo return real; double imagcomplexo i return imag double abscomplexo i double t; t=real *real+imag *imag; return sqrt(t);
4 2. 类的定义(声明) C++中说明类的一般形式为 clsaa 类名 { private: (可缺省) 私有数据成员和函数成员 protected: 保护段 public: 公有数据成员和函数成员 }; class complex{ private: double real, imag; public: void init (double r, double i) { real=r; imag=i; } double realcomplex() { return real;} double imagcomplex() { return imag;} double abscomplex() { double t; t=real*real+imag*imag; return sqrt(t); } }; 类 class 和结构 sturct 的主要区别是: 在缺省 private 时, 在类中,成员是私有的 在结构中,成员是公有的
例32 #include #include class complex( private: d hubie re al, imag? public void init(double r, double i real=r; imag=i;) double realcomplexo i return real; 3 double imagcomplexo( return imag double abscomplexo i double t; t=real*real+imag *imag; return sgrt(t; void main( i complex A; Aini(1.1,2.2) cout<“复数A的实部=“<A. realcomplex0<end; cout<<s 复数A的实部=“<< A. imagcomplexo<end; cout<“复数A的绝对值=“<A. abscomplexo<<endl;
5 例 3.2 #include #include class complex{ private: double real, imag; public: void init (double r, double i) { real=r; imag=i; } double realcomplex() { return real;} double imagcomplex() { return imag;} double abscomplex() { double t; t=real*real+imag*imag; return sqrt(t); } }; void main( ) { complex A; A.init(1.1,2.2); cout<<“复数A的实部= “<<A.realcomplex()<<endl; cout<<“复数A的实部= “<<A.imagcomplex()<<endl; cout<<“复数A的绝对值= “<<A.abscomplex()<<endl; }
312成员函数的定义 第一种方式是在类定义中只给出成员函数的原型(或者说声明) 而成员函数在类的外部定义。在外部定义的一般形式是: 返回类型类名:函数名(参数表) ∥函数体 class point ∥定义类 point private: Int x, y; ∥数据成员,二个整数作为x,y坐标 publics void setpoint(int,int);∥/函数成员,名为 Setpoint,有二个 整数形参,用于设置坐标值,具体如何在外部再定义,这叫函数 的原型(或者说声明) int getxo;/取x坐标值的成员函数getx0的函数原型 int geto;/取y坐标值的成员函数gety的函数原型 };1类定义结束 viod point: setpoint(inta,intb)∥成员函数 setpoint具体定义 ix=a; y=b int point: getxo ∥成员函数gex具体定义 return x int point: grtyo ∥成员函数gety具体定义6 return y;)
6 3.1.2 成员函数的定义 第一种方式是在类定义中只给出成员函数的原型(或者说声明), 而成员函数在类的外部定义。在外部定义的一般形式是: 返回类型 类名::函数名(参数表){ // 函数体 } class point{ // 定义类 point private: int x, y; // 数据成员,二个整数作为x,y 坐标 public: void setpoint(int, int); // 函数成员,名为setpoint ,有二个 整数形参,用于设置坐标值,具体如何在外部再定义,这叫函数 的原型(或者说声明) int getx(); //取 x 坐标值的成员函数getx()的函数原型 int gety(); //取 y 坐标值的成员函数gety()的函数原型 }; //类定义结束 viod point::setpoint(int a, int b) //成员函数 setpoint 具体定义 { x=a; y=b; } int point:: getx() //成员函数getx 具体定义 { return x; } int point:: grty() //成员函数gety 具体定义 { return y; }
说明 (1)在所定义的成员函数名之前应缀上类名,在类名和函数名之 间应加上分隔符“:”,例如上面例子中的“ point:” (2)在定义成员函数时,对函数所带的参数,不但要说明它的类 型,还要指出其参数名。 (3)在定义成员函数时,其返回类型一定要与函数原型中声明的 返回类型匹配。 第二种方式是将成员函数定义在类的内部,即定义为内置函数。 又可用两种 (1)隐式定义即函数的原型和定义都在类的内部完成 class point ∥定义类 point p rivate. IntX, yg ∥数据成员,二个整数作为xy坐标 public: void setpoint(inta,intb)∥函数成员 {x=a;y=b;} int getxo return x;) int getto i return y;) };1类定义结束
7 说明 (1)在所定义的成员函数名之前应缀上类名,在类名和函数名之 间应加上分隔符“::”,例如上面例子中的“point::”。 (2)在定义成员函数时,对函数所带的参数,不但要说明它的类 型,还要指出其参数名。 (3)在定义成员函数时,其返回类型一定要与函数原型中声明的 返回类型匹配。 第二种方式是将成员函数定义在类的内部,即定义为内置函数。 又可用两种: (1) 隐式定义 即函数的原型和定义都在类的内部完成 class point{ // 定义类 point private: int x, y; // 数据成员,二个整数作为x,y 坐标 public: void setpoint(int a, int b) // 函数成员 { x=a; y=b; } int getx() { return x; } int gety() { return y; } }; //类定义结束
显式定义 在类定义中仍只给出成员函数的原型(或者说声明),而成员函 数在类的外部定义。但函数定义前冠以关键字“ inline”,以此显 式地说明这是一内置函数 lass pointt ∥定义类 point private: int x, y, ∥数据成员,二个整数作为x,y坐标 public void setpoint(int,int);∥函数成员 setpoint,有二个整数形参 int getxO;∥取x坐标值的成员函数 getxo的函数原型 int getto;∥取y坐标值的成员函数 geto的函数原型 };∥类定义结束 in line viod point: setpoint(int a,intb)∥内置成员函数具体定义 {x=a;y=b;} inline int point: getxo ∥1置成员函数getx具体定义 return x inline int point: grtyo ∥1置成员函数gety具体定义 freturn ; 把成员函数设置成内置,可提高执行的效率,但函数体较长的成员 函数都不设置成内置
8 (2) 显式定义 即在类定义中仍只给出成员函数的原型(或者说声明),而成员函 数在类的外部定义。但函数定义前冠以关键字“inline”,以此显 式地说明这是一内置函数。 class point{ // 定义类 point private: int x, y; // 数据成员,二个整数作为x,y 坐标 public: void setpoint(int, int); // 函数成员setpoint ,有二个整数形参 int getx(); //取 x 坐标值的成员函数getx()的函数原型 int gety(); //取 y 坐标值的成员函数gety()的函数原型 }; //类定义结束 inline viod point::setpoint(int a, int b) //内置成员函数具体定义 { x=a; y=b; } inline int point:: getx() //内置成员函数getx 具体定义 { return x; } inline int point:: grty() //内置成员函数gety 具体定义 { return y; } 把成员函数设置成内置,可提高执行的效率,但函数体较长的成员 函数都不设置成内置
313对象的定义及引用 类与对象的关系 可以用整型int和整型变量i之间的来类比。inti 2.对象的定义 (1)在声明类的同时,直接定义对象op1,op2 class point ∥定义类 point private: nt x, v: ∥数据成员,二个整数作为x,y坐标 public void setpoint(int, int); int getx(; int geto 3 opl, op2 (2)声明了类之后,在使用时再定义对象,定义的格式与一般变 量的定义格式相同: point opl,,op2; 说明:(1)声明了一个类便声明了一种类型,它并不接收和存储 具体的值,只有定义了对象后,系统才为对象并且只为对象分配 存储空间。 (2)在声明类的同时定义的对象是一种全局对象,在它的 生存期内任何函数都可以使用它
9 3.1.3 对象的定义及引用 1. 类与对象的关系 可以用整型int 和整型变量i 之间的来类比。int i ; 2. 对象的定义 (1) 在声明类的同时,直接定义对象 op1, op2 class point{ // 定义类 point private: int x, y; // 数据成员,二个整数作为x,y 坐标 public: void setpoint(int, int); int getx(); int gety(); } op1, op2; (2) 声明了类之后,在使用时再定义对象,定义的格式与一般变 量的定义格式相同: point op1, op2; 说明:(1)声明了一个类便声明了一种类型,它并不接收和存储 具体的值,只有定义了对象后,系统才为对象并且只为对象分配 存储空间。 (2) 在声明类的同时定义的对象是一种全局对象,在它的 生存期内任何函数都可以使用它
3.对象的引用 对象的引用是指对象的成员的引用,不论是数据成员,还是成员 函数,只要是公有的,就可以被外部函数直接引用,引用格式是 对象名数据成员名或对象名.成员函数名(实参表) 例33 #include void mainO lass poi i point opl, op2 private: int i, i intx public opl setpoint(1,2;/调用op的 setpoint0,初始化对象op1 vod!Op2 setpoint(34;调用op的 Isetpoir0,初始化对象op 2 i= Fopl getxo;/调用op1的gt0,取op1的x值 int ge j=op 1 geto;∥调用op1的 geto,取op1的y值 int ge cout<“opli=”<i<“op1j=<j<endl i=0p2 getxO;∥调用op2的 getxo,取op2的x值 j=op2. geto;∥调用op2的 geto,取op2的y值 cout<“op2i=”<i<“0p2j=<j<<endl
10 3.对象的引用 对象的引用是指对象的成员的引用,不论是数据成员,还是成员 函数,只要是公有的,就可以被外部函数直接引用,引用格式是: 对象名. 数据成员名 或 对象名. 成员函数名(实参表) 例 3.3 #include class point{ private: int x, y; public: void setpoint(int a, int b) { x=a; y=b; } int getx() { return x; } int gety() { return y; } }; void main() { point op1, op2; int i, j; op1.setpoint(1,2);//调用op1的setpoint(),初始化对象op1 op2.setpoint(3,4);//调用op2的setpoint(),初始化对象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; }