已阅读5页,还剩115页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
程序设计基础(c+),运算符重载,学习内容,类之间的关系 类的对象成员 类的嵌套 运算符重载,一个类的对象作为另一个类的数据成员,一个类中的数据成员可以是某一个类的一个对象 在c+中,当把一个类的对象作为新类的数据员时,则新类的定义格式可表示为: class x 类名1 成员名1; 类名2 成员名2; 类名n 成员名n; /其它成员 ;,一个类的对象作为另一个类的数据成员,构造函数: 如果一个类a的对象作为另一个类b的数据成员,则在类b的对象创建过程中,调用其构造函数的过程中,数据成员(类a的对象)会自动调用类a的构造函数。 但应注意: 如果类a的构造函数为有参函数时,则在程序中必须在类b的构造函数的括号后面加一“:”和被调用的类a的构造函数, 且调用类a的构造函数时的实参值必须来自类b的形参表中的形参 这种方法称为初始化表的方式调用构造函数。,一个类的对象作为另一个类的数据成员,例子(以上面定义的类x为例): 在对类x的对象进行初始化时,必须首先初始化其中的子对象,即必须首先调用这些子对象的构造函数 类x的构造函数的定义格式应为: x:x(参数表0):成员1(参数表1),成员2(参数表2),成员n(参数表n) 说明: 其中,参数表1提供初始化成员1所需的参数,参数表2提供初始化成员2所需的参数,依此类推。 并且这几个参数表的中的参数均来自参数表0,另外,初始化x的非对象成员所需的参数,也由参数表0提供。,class date private: int year; int month; int day; public: date(int fyear,int fmonth, int fday) cout“构造日期“endl; year=fyear; month=fmonth; day=fday; void print() cout“year=“ year “ month=“month “ day=“dayendl; ;,class time private: int hour; int minute; int second; public: time() cout“构造时间“endl; hour =0; minute=0; second=0; void print() cout“hour=“hour “ minute=“minute “ second=“secondendl; ;,例子1,class schedule private: date mdate; time mtime; int num; public: schedule(int x,int y, int z, int k ): mdate(x,y,z) cout“构造时间安排“endl; num = k; void print() cout“number=“ num endl; mdate.print(); mtime.print(); ;,int main() schedule sche1(2009,9,10,1); sche1.print(); schedule sche2(2010,10,20,2); sche2.print(); return 0; ,结果: 构造日期 构造时间 构造时间安排 number=1 year=2009 month=9 day=10 hour=0 minute=0 second=0 构造日期 构造时间 构造时间安排 number=2 year=2010 month=10 day=20 hour=0 minute=0 second=0,例子2,class date private: int year; int month; int day; public: date(int fyear,int fmonth, int fday) cout“构造日期“endl; year=fyear; month=fmonth; day=fday; void print() cout“year=“year “ month=“month “ day=“dayendl; ;,class time private: int hour; int minute; int second; public: time(int a,int b,int c) cout“构造时间“endl; hour =a; minute=b; second=c; void print() cout“hour=“hour “ minute=“minute “ second=“secondendl; ;,class schedule private: date mdate; time mtime; int num; public: schedule(int x,int y,int z,int a,int b,int c,int k ) :mdate(x,y,z),mtime(a,b,c) cout“构造时间安排“endl; num=k; void print() cout“number=“numendl; mdate.print(); mtime.print(); ;,int main() schedule sche1(2005,9,10,3,10,0,1); sche1.print(); schedule sche2(2004,8,3,4,5,7,2); sche2.print(); return 0; ,结果: 构造日期 构造时间 构造时间安排 number=1 year=2005 month=9 day=10 hour=3 minute=10 second=0 构造日期 构造时间 构造时间安排 number=2 year=2004 month=8 day=3 hour=4 minute=5 second=7,一个类的对象作为另一个类的数据成员,调用构造函数的顺序: 在构造新类的对象过程中,系统首先调用其子对象的构造函数,初始化子对象 然后才执行类x自己的构造函数,初始化类中的非对象成员。 对于同一类中的不同子对象,系统按照它们在类中的说明顺序调用相应的构造函数进行初始化,而不是按照初始化表的顺序。 例子: 以下定义了三个student、teacher和tourpair, 其中student类的对象和teacher类的对象作为了tourpair的数据成员 观察对象的构造过程和构造函数被执行的顺序。,例子,class student public: student() cout“construct student.n“; semeshours=100; gpa=3.5; protected: int semeshours; float gpa; ;,class teacher public: teacher() cout“construct teacher.n“; ; class tutorpair public: tutorpair() cout“construct tutorpair.n“; protected: student student; teacher teacher; ;,例子,int main() tutorpair tp; cout“back in main.n“; return 0; ,运行结果: construct student. construct teacher. construct tutorpair. back in main.,另外一个例子,class student public: student(char *pname=“no name“) cout“构造新同学:“pnameendl; strncpy(name,pname,sizeof(name); namesizeof(name)-1=0; student(student ,另外一个例子,class tutor public: /此为初始化表,调用 /student的拷贝构造函数 tutor(student ,int main() /此处调用student的构造函数 /student(char *pname=“no name“) student st1; student st2(“zhang“); /同上 /此处调用tutor的构造函数tutor(student ,构造新同学:no name 构造新同学:zhang 构造copy of zhang 构造指导教师 析构 copy of zhang 析构 zhang 析构 no name,类的嵌套,在类中可以定义用户定义的数据类型 在类说明中也可以定义类 类的嵌套:一个类的说明包含在另一个类的说明中,# include using namespace std; class cc class c1 private: public: ; public: class c2 private: public: ; c1 f1(c2); ;,c1是类cc的私有嵌套类,类cc外的函数中不能使用它 类c2是类cc的共有嵌套类,可以在cc类外使用,但类名应该为cc:c2,如在main()中定义: c1 a, b; c2 a, b; cc:c1 a, b cc:c2 a, b ,嵌套类的使用并不方便, 不宜多用!,运算符重载,c+语言中预定义的运算符的操作对象只能是基本的数据类型 但是,在实际应用中,对于很多用户自定义的数据类型(如类)也需要类似的功能 需要对已有的运算符赋予多种含义,使同一个运算符作用于不同类型的数据时导致不同类型的行为 运算符重载 优点 允许改变使用系统内部的运算的操作方式,以适应用户新定义类型的类似运算,运算符重载,运算符重载的实质是函数重载 c+ 语言中每个运算符对应着一个运算符函数,在实现过程中把指定的运算表达式中的运算符转化为对运算符函数的调用 表达式中的运算对象转化为运算符函数的实参,这个过程是在编译阶段完成的 例如: int a=1,b=2; a+b; 表达式a+b在编译时,将被解释成为函数调用的形式 operator+(a,b); operator是一个关键字,它与后面的+共同组成了该运算符函数的函数名,运算符重载使得用户自定义的数据以一种更简洁的方式工作,例如 int x , y ; y = x + y ;,matrix m1 , m2 ; / 矩阵类对象 m1 = madd ( m1 , m2 ) ; / 调用函数计算两个矩阵的和,complex c1 , c2 ; / 复数类对象 c1 = cadd (c1 , c2 ) ; / 调用函数计算两个复数的和,能表示为 c1 = c1 + c2 ; ?,能表示为 m1 = m1 + m2 ; ?,定义 运算符重载函数,运算符重载,运算符重载,可以重载的运算符 + - * / % & | ! = += -= *= /= % = &= |= = = & | + - -* - () new delete new delete 、 不能重载的算符 . : .* ?: sizeof,运算符重载,运算符重载 是对已有的运算符赋予多重含义,使同一运算符作用于不同的对象导致不同的行为。 运算符重载的实质就是函数重载。 运算符的重载与函数重载的方法一致 运算符重载的一般格式为: 类型名 operator(形参表) 说明: operator是关键字,是运算符 在c+中几乎所有的运算符(除“.”、“.*”、“:”、“?:”外)都可以被重载 运算符的重载既不会改变原运算符的优先级和结合性,也不会改变使用运算符的语法和参数个数 不可臆造新的运算符,必须是c+中的已有的可以重载的运算符,运算符重载的两种形式,由于重载后的运算符函数经常需要访问类的私有成员,因此运算符函数operator()通常被声明为类的成员函数或友元函数。 类运算符: 将运算符重载为类的成员函数,则该运算符称为类运算符。一般性形式如下: 返回类型类名:operator运算符(形参表) /*函数体重新定义运算符在指定类中的功能*/ 当重载为类的成员函数时,运算符重载函数的形参个数要比运算符操作数个数少一个,运算符重载的两种形式,2.友元运算符: 将运算重载为类的友元函数,则该运算符称为友元运算符。 一般形式如下: friend 返回类型operator运算符(形参表) /*函数体*/ 若重载为友元函数,则参数个数与操作数个数相同。,运算符函数是一种特殊的成员函数或友元函数 成员函数的语法形式为: 类型 类名 : operator op ( 参数表 ) / 相对于该类定义的操作 ,运算符函数是一种特殊的成员函数或友元函数 成员函数的语法形式为: 类型 类名 : operator op ( 参数表 ) / 相对于该类定义的操作 ,函数返回类型,运算符函数是一种特殊的成员函数或友元函数 成员函数的语法形式为: 类型 类名 : operator op ( 参数表 ) / 相对于该类定义的操作 ,重载该运算符的类,运算符函数是一种特殊的成员函数或友元函数 成员函数的语法形式为: 类型 类名 : operator op ( 参数表 ) / 相对于该类定义的操作 ,被重载的运算符,关键字,运算符函数是一种特殊的成员函数或友元函数 成员函数的语法形式为: 类型 类名 : operator op ( 参数表 ) / 相对于该类定义的操作 ,函数名,运算符函数是一种特殊的成员函数或友元函数 成员函数的语法形式为: 类型 类名 : operator op ( 参数表 ) / 相对于该类定义的操作 ,运算符函数是一种特殊的成员函数或友元函数 成员函数的语法形式为: 类型 类名 : operator op ( 参数表 ) / 相对于该类定义的操作 ,运算符要求的操作数,一个运算符被重载后,原有意义没有失去,只是定义了相对一特定类的一个新运算符,运算符函数是一种特殊的成员函数或友元函数 成员函数的语法形式为: 类型 类名 : operator op ( 参数表 ) / 相对于该类定义的操作 ,#include #include using namespace std; class calculator public: calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() calculator counter ; int i ; for( i = 0 ; i 5 ; i + ) + counter; cout “n counter = “ counter() ; for( i = 0 ; i = 5 ; i + ) - counter; cout “n counter = “ counter() ; ,void calculator:operator + () if ( value 0 ) value - ; else cout “n data overflow !“ endl ; exit( 0 ) ; unsigned int calculator:operator() () return value ; ,#include #include using namespace std; class calculator public: calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() calculator counter ; int i ; for( i = 0 ; i 5 ; i + ) + counter; cout “n counter = “ counter() ; for( i = 0 ; i = 5 ; i + ) - counter; cout “n counter = “ counter() ; ,void calculator:operator + () if ( value 0 ) value - ; else cout “n data overflow !“ endl ; exit( 0 ) ; unsigned int calculator:operator() () return value ; ,重载了 3个算符,#include #include using namespace std; class calculator public: calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() calculator counter ; int i ; for( i = 0 ; i 5 ; i + ) + counter; cout “n counter = “ counter() ; for( i = 0 ; i = 5 ; i + ) - counter; cout “n counter = “ counter() ; ,void calculator:operator + () if ( value 0 ) value - ; else cout “n data overflow !“ endl ; exit( 0 ) ; unsigned int calculator:operator() () return value ; ,重载了 3个算符,#include #include using namespace std; class calculator public: calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() calculator counter ; int i ; for( i = 0 ; i 5 ; i + ) + counter; cout “n counter = “ counter() ; for( i = 0 ; i = 5 ; i + ) - counter; cout “n counter = “ counter() ; ,void calculator:operator + () if ( value 0 ) value - ; else cout “n data overflow !“ endl ; exit( 0 ) ; unsigned int calculator:operator() () return value ; ,void calculator : operator + () if ( value 65535 ) value + ; else cout “ndata overflow !“ endl ; exit( 0 ) ; ,#include #include using namespace std; class calculator public: calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() calculator counter ; int i ; for( i = 0 ; i 5 ; i + ) + counter; cout “n counter = “ counter() ; for( i = 0 ; i = 5 ; i + ) - counter; cout “n counter = “ counter() ; ,void calculator:operator + () if ( value 0 ) value - ; else cout “n data overflow !“ endl ; exit( 0 ) ; unsigned int calculator:operator() () return value ; ,void calculator : operator + () if ( value 65535 ) value + ; else cout “ndata overflow !“ endl ; exit( 0 ) ; ,使用 系统预定义版本,#include #include using namespace std; class calculator public: calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() calculator counter ; int i ; for( i = 0 ; i 5 ; i + ) + counter; cout “n counter = “ counter() ; for( i = 0 ; i = 5 ; i + ) - counter; cout “n counter = “ counter() ; ,void calculator:operator + () if ( value 0 ) value - ; else cout “n data overflow !“ endl ; exit( 0 ) ; unsigned int calculator:operator() () return value ; ,void calculator : operator - () if ( value 0 ) value - ; else cout “n data overflow !“ endl ; exit( 0 ) ; ,#include #include using namespace std; class calculator public: calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() calculator counter ; int i ; for( i = 0 ; i 5 ; i + ) + counter; cout “n counter = “ counter() ; for( i = 0 ; i = 5 ; i + ) - counter; cout “n counter = “ counter() ; ,void calculator:operator + () if ( value 0 ) value - ; else cout “n data overflow !“ endl ; exit( 0 ) ; unsigned int calculator:operator() () return value ; ,void calculator : operator - () if ( value 0 ) value - ; else cout “n data overflow !“ endl ; exit( 0 ) ; ,使用 系统预定义版本,#include #include using namespace std; class calculator public: calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() calculator counter ; int i ; for( i = 0 ; i 5 ; i + ) + counter; cout “n counter = “ counter() ; for( i = 0 ; i = 5 ; i + ) - counter; cout “n counter = “ counter() ; ,void calculator:operator + () if ( value 0 ) value - ; else cout “n data overflow !“ endl ; exit( 0 ) ; unsigned int calculator:operator() () return value ; ,+ counter;,调用重载版本,void operator + () ;,#include #include using namespace std; class calculator public: calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() calculator counter ; int i ; for( i = 0 ; i 5 ; i + ) + counter; cout “n counter = “ counter() ; for( i = 0 ; i = 5 ; i + ) - counter; cout “n counter = “ counter() ; ,void calculator:operator + () if ( value 0 ) value - ; else cout “n data overflow !“ endl ; exit( 0 ) ; unsigned int calculator:operator() () return value ; ,调用重载版本,+ counter;,void operator + () ;,#include #include using namespace std; class calculator public: calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() calculator counter ; int i ; for( i = 0 ; i 5 ; i + ) + counter; cout “n counter = “ counter() ; for( i = 0 ; i = 5 ; i + ) - counter; cout “n counter = “ counter() ; ,void calculator:operator + () if ( value 0 ) value - ; else cout “n data overflow !“ endl ; exit( 0 ) ; unsigned int calculator:operator() () return value ; ,调用重载版本,counter.operator+() ;,void operator + () ;,#include #include using namespace std; class calculator public: calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() calculator counter ; int i ; for( i = 0 ; i 5 ; i + ) + counter; cout “n counter = “ counter() ; for( i = 0 ; i = 5 ; i + ) - counter; cout “n counter = “ counter() ; ,void calculator:operator + () if ( value 0 ) value - ; else cout “n data overflow !“ endl ; exit( 0 ) ; unsigned int calculator:operator() () return value ; ,- counter;,调用重载版本,void operator - () ;,#include #include using namespace std; class calculator public: calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() calculator counter ; int i ; for( i = 0 ; i 5 ; i + ) + counter; cout “n counter = “ counter() ; for( i = 0 ; i = 5 ; i + ) - counter; cout “n counter = “ counter() ; ,void calculator:operator + () if ( value 0 ) value - ; else cout “n data overflow !“ endl ; exit( 0 ) ; unsigned int calculator:operator() () return value ; ,调用重载版本,- counter;,void operator - () ;,#include #include using namespace std; class calculator public: calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() calculator counter ; int i ; for( i = 0 ; i 5 ; i + ) + counter; cout “n counter = “ counter() ; for( i = 0 ; i = 5 ; i + ) - counter; cout “n counter = “ counter() ; ,void calculator:operator + () if ( value 0 ) value - ; else cout “n data overflow !“ endl ; exit( 0 ) ; unsigned int calculator:operator() () return value ; ,调用重载版本,counter.operator-() ;,void operator - () ;,#include #include using namespace std; class calculator public: calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() calculator counter ; int i ; for( i = 0 ; i 5 ; i + ) + counter; cout “n counter = “ counter() ; for( i = 0 ; i = 5 ; i + ) - counter; cout “n counter = “ counter() ; ,void calculator:operator + () if ( value 0 ) value - ; else cout “n data overflow !“ endl ; exit( 0 ) ; unsigned int calculator:operator() () return value ; ,counter () ;,调用重载版本,void operator () () ;,#include #include using namespace std; class calculator public: calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() calculator counter ; int i ; for( i = 0 ; i 5 ; i + ) + counter; cout “n counter = “ counter() ; for( i = 0 ; i = 5 ; i + ) - counter; cout “n counter = “ counter() ; ,void calculator:operator + () if ( value 0 ) value - ; else cout “n data overflow !“ endl ; exit( 0 ) ; unsigned int calculator:operator() () return value ; ,counter () ;,void operator () () ;,被重载的运算符,#include #include using namespace std; class calculator public: calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() calculator counter ; int i ; for( i = 0 ; i 5 ; i + ) + counter; cout “n counter = “ counter() ; for( i = 0 ; i = 5 ; i + ) - counter; cout “n counter = “ counter() ; ,void calculator:operator + () if ( value 0 ) value - ; else cout “n data overflow !“ endl ; exit( 0 ) ; unsigned int calculator:operator() () return value ; ,counter () ;,counter. operator() () ;,void operator () () ;,函数参数表,#include #include using namespace std; class calculator public: calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() calculator counter ; int i ; for( i = 0 ; i 5 ; i + ) + counter; cout “n counter = “ counter() ; for( i = 0 ; i = 5 ; i + ) - counter; cout “n counter = “ counter() ; ,void calculator:operator + () if ( value 0 ) value - ; else cout “n data overflow !“ endl ; exit( 0 ) ; unsigned int calculator:operator() () return value ; ,#include #include using namespace std; class calculator public: calculator() value = 0 ; ; void operator + () ; void operator - () ; unsigned int operator() () ; private: unsigned int value; ; int main() calculator counter ; int i ; for( i = 0 ; i 5 ; i + ) + counter; cout “n counter = “ counter() ; for( i = 0 ; i = 5 ; i + ) - counter; cout “n counter = “ counter() ; ,void calculator:operator + () if ( value 0 ) value - ; else cout “n data overflow !“ endl ; exit( 0 ) ; unsigned int calculator:operator() () return value ; ,运算符重载,“=” “()” “” “-”不能重载为友元函数 当运算符重载为类的成员函数时,函数参数的个数比原来运算对象数少一个(右+和右除外) 当重载为类的友元函数时,参数个数与原运算符的运算数个数相同 单目运算符最好重载为类的成员函数,而双目运算符最好重载为类的友元函数,类运算符,对于双目元算符 如果要重载为类x的运算符,使之实现表达式oprd1oprd2 其中orpd1是类x的对象,则 把重载为类x的成员函数 该函数只有一个形参,形参的类型是oprd2所属的类型 编译器把表达式oprd1oprd2解释为函数调用: oprd1.operator(oprd2),类运算符,对于前置单目元算符 如果要重载为类x的运算符,用来实现表达式oprd,其中orpd是类x的对象, 则把重载为类x的成员函数 该函数没有形式参数 编译器把表达式oprd解释为函数调用 oprd.operator( ),类运算符的例子,class sample private: int x; public: sample() sample(int a) x = a; void disp() cout“x=“xendl; sample operator+(sample,sample sample:operator +(sample ,int main() sample obj1(10); sample obj2(20); sample obj3; sample o
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论