您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 3-3.C++面向对象程序设计―C++的其它语言特性
程序设计实习INFO130048程序设计实习程序设计实习INFO130048INFO13004833--3.C++3.C++面向对象程序设计面向对象程序设计——静态类成员、运算符重载、模板函数静态类成员、运算符重载、模板函数//类以类以及其它语言特性及其它语言特性复旦大学计算机科学与工程系复旦大学计算机科学与工程系彭鑫彭鑫pengxin@fudan.edu.cnpengxin@fudan.edu.cn复旦大学计算机科学与工程系本科生课程程序设计实习2/44内容摘要内容摘要•静态类成员•C++的一些语言特性•运算符重载•模板函数和模板类•C++输入/输出流复旦大学计算机科学与工程系本科生课程程序设计实习3/44内容摘要内容摘要••静态类成员静态类成员•C++的一些语言特性•运算符重载•模板函数和模板类•C++输入/输出流复旦大学计算机科学与工程系本科生课程程序设计实习4/44类的静态成员类的静态成员•类的每个对象实例通常具有独立的数据成员,但也存在类的所有对象共享方法或数据成员的特殊情况,称为静态(static)类成员–类的静态属性(数据成员)属于类,而不属于对象–类的静态方法只能对类的静态数据成员进行操作•静态类成员例–记录某类当前对象总数的计数器–类的全部对象组成的链表的首指针复旦大学计算机科学与工程系本科生课程程序设计实习5/44对对静态成员的访问静态成员的访问在类的外部访问类的公共静态数据成员或成员函数有两种方式:1)类名::静态成员名例如Student::count,Student::getCount()2)对象名.静态成员名例如stu.count,stu.getCount()这时从任意一个对象实例访问到的是同一个类成员变量或方法复旦大学计算机科学与工程系本科生课程程序设计实习6/44类的静态属性示例类的静态属性示例静态属性静态属性静态方法静态方法分别用类名和三个对象名或分别用类名和三个对象名或对象引用访问对象引用访问getCountgetCount方法方法四种访问方法得到同样结果四种访问方法得到同样结果因为析构函数没有对计数器减因为析构函数没有对计数器减11复旦大学计算机科学与工程系本科生课程程序设计实习7/44类的静态方法只能访问静态属性类的静态方法只能访问静态属性errorC2597:illegalreferencetodatamembererrorC2597:illegalreferencetodatamember''Student::snameStudent::sname'inastaticmemberfunction'inastaticmemberfunction静态静态((类类))属性属性对象属性对象属性静态方法只能访问本类静态方法只能访问本类的静态属性,因为静态的静态属性,因为静态方法属于整个类方法属于整个类((甚至于甚至于一个对象都没有的时候一个对象都没有的时候就可以访问静态方法了就可以访问静态方法了))复旦大学计算机科学与工程系本科生课程程序设计实习8/44内容摘要内容摘要•静态类成员••C++C++的一些语言特性的一些语言特性•运算符重载•模板函数和模板类•C++输入/输出流复旦大学计算机科学与工程系本科生课程程序设计实习9/44变量的定义变量的定义•C++程序中临时变量可以随时在使用之前才进行定义,例如for(inti=0;iN;i++)cout’\t’a[i];coutendl;//输出一个换行符•在for控制结构内声明的变量i的作用域从其说明处开始至其所在的最小语句块结束处(右花括号或单行)终止复旦大学计算机科学与工程系本科生课程程序设计实习10/44变量的初始化变量的初始化•对象的初始值在对象定义(初始化)时指定•在C++语言中,为数据对象指定初始值的描述形式有两种,如下面的示意例子所示:–intk=5;//C语言的初始化描述方法–intj(5);//C++语言新增加的初始化描述方法复旦大学计算机科学与工程系本科生课程程序设计实习11/44匿名对象匿名对象•以对象作为形参的函数在传值时可以通过传构造器参数的方式创建匿名对象•test函数被调用时以4为构造器参数构造一个匿名的Rectangle对象作为实参匿名:没有对象变量指向该对象实例复旦大学计算机科学与工程系本科生课程程序设计实习12/44内联函数内联函数•为了整体程序的清晰一般要尽量将逻辑独立的程序块定义为独立的函数,然而函数调用会造成额外的开销•内联函数:既把一个程序段定义为函数,又要在调用时不作为一般函数调用处理•定义方式:在函数返回值类型前加inline关键字–例如:inlineinttest();复旦大学计算机科学与工程系本科生课程程序设计实习13/44内联函数的处理机制内联函数的处理机制•编译器把对内联函数的调用处理为函数执行代码在调用处的拷贝展开•类似于宏展开,区别在于:–内联函数要做类型检查而宏展开只是字符串替换–内联函数不会在错误使用时产生意想不到的后果复旦大学计算机科学与工程系本科生课程程序设计实习14/44constconst变量变量//对象对象•const关键字是一个类型修饰符,用它产生一个派生类型,表示该类型的对象是不能被修改的常对象•const变量/对象必须在说明的时候进行初始化•使用方法–Tconst,其中T是类型表达式,当T是一个类型名时也可写成constT,例如:•constdoublePI=3.14159265;•intconstMAXN=100;•constfloatmoney[]={0.01,0.02,0,05,0.10,0.50,1.00,2.00,5.00,10.00,50.00,100.00};•inta[MAXN];int*constp=a;–说明变量PI、MAXN、数组money的全部元素、以及p都不能被修改,但p所指元素a[0]可以更改–注意int*constq与intconst*h的区别,前者表示指针q是常对象,后者表示h所指对象要是常对象,而h是变量复旦大学计算机科学与工程系本科生课程程序设计实习15/44constconst形参形参•当函数形参的类型是指针或引用,且要求该函数不能更新这些形参所标识的对象时,这些形参应该用const特别修饰•例如:voiddisplay(constRectangle*a);–在函数display中,形参s是指针,它所指的变量是常对象,即s是可以更改的,但它所指对象不允许更改复旦大学计算机科学与工程系本科生课程程序设计实习16/44函数形参的默认值函数形参的默认值•使用形参默认值的情形:在大多数情况下某些形参对应的实参值总是一样的•对于这样的形参,函数定义时,可为它们预先指定默认值–函数调用时,如实参就是这个默认值就可以不再给出实参–为适应实参与形参按位置顺序逐一对应的规定,函数定义中有默认值的形参必须被按排在靠后的位置–voiddrawLine(intx1,inty1,intx0=0,inty0=0)复旦大学计算机科学与工程系本科生课程程序设计实习17/44友函数和友类友函数和友类•在类的封装性之外,为了方便可以允许某些特殊的函数从类的外面访问类内部的私有成员•友函数和友类–类A将某个类A外的函数f或类B说明为它的友函数或友类后,函数f和类B就能引用类A的私有成员和受保护成员–这是一种破坏数据封装和数据隐藏的机制复旦大学计算机科学与工程系本科生课程程序设计实习18/44友类友类classA{friendclassB;//B类是A类的友类public:……private:intx;};classB{public:voidchange(Aa);……};voidB::change(Aa){A.x++;}•B类中的成员函数可以访问A类中的私有成分•单向:A类中的成员还是不能访问B类的私有成分•声明友类的控制权在自已,只能声明某类是自已的友类,不能声明自已是另一个类的友类•友类关系没有传递性复旦大学计算机科学与工程系本科生课程程序设计实习19/44友函数友函数友函数主要用于操作符重载(见10.4节)classA{friendvoidaFun(Aa);//aFun是A类友函数public:……private:intx;};voidA::aFun(Aa){A.x++;}复旦大学计算机科学与工程系本科生课程程序设计实习20/44内容摘要内容摘要•静态类成员•C++的一些语言特性••运算符重载运算符重载•模板函数和模板类•C++输入/输出流复旦大学计算机科学与工程系本科生课程程序设计实习21/44运算符重载运算符重载•C语言中的运算符也是允许重载的,例如整型和实型都用“+”表示加法•C++中进一步允许用户程序对运算符作重载定义•对于逻辑意义相同,运算分量类型不同的运算可在已有的运算符上定义自已的实现逻辑复旦大学计算机科学与工程系本科生课程程序设计实习22/44重载方式重载方式11:定义为类的友函数:定义为类的友函数•目的:使重载运算符在执行运算时可以任意访问运算对象的内部属性•函数参数个数与运算符原操作数个数相同•如果该运算不对运算参数对象作任何修改,那么参数前一般加const限定复旦大学计算机科学与工程系本科生课程程序设计实习23/44运算符重载例运算符重载例((类的友函数类的友函数))友函数声明友函数声明运算符重载函数运算符重载函数复旦大学计算机科学与工程系本科生课程程序设计实习24/44运行结果运行结果这两个语句以同这两个语句以同样的方式创建了样的方式创建了一个新对象一个新对象复旦大学计算机科学与工程系本科生课程程序设计实习25/44重载方式重载方式22:定义为类的成员方法:定义为类的成员方法•将运算符函数定义为类的成员方法后同样可以自由访问类的私有属性•此时当前类的对象自动充当运算符最左边的那个操作数,因此参数的个数比原来的操作数少一个–如果重载前置单目运算符(例如前++),那么没有任何参数,该操作符只对当前对象进行操作–如果重载后置单目运算符(例如后++),那么要带一个整形形参以作区分复旦大学计算机科学与工程系本科生课程程序设计实习26/44运算符重载例运算符重载例((类的成员方法类的成员方法))重载重载++运算符后运算符后p1+p2p1+p2的效果的效果等同于等同于p1.+(p2)p1.+(p2),其中,其中p1.+p1.+是是p1p1中重载后的中重载后的++方法方法复旦大学计算机科学与工程系本科生课程程序设计实习27/44运行结果运行结果这两个语句以同这两个语句以同样的方式创建了样的方式创建了一个新对象一个新对象两种重载方式两种重载方式((成员方法和友函数成员方法和友函数))的执行结果也相同的执行结果也相同复旦大学计算机科学与工程系本科生课程程序设计实习28/44注意注意运算符重载运算参数可以是不同类型运算符重载运算参数可以是不同类型运算结果类型也可以与运算对象不同运算结果类型也可以与运算对象不同复旦大学计算机科学与工程系本科生课程程序设计实习29/44可以重载的运算符可以重载的运算符C++中允许重载的运算符如下:+-*/%^&|~!,===++--==!=&&||+=-=*=/=%=^=&=|===[]()--*newdelete复旦大学计算机科学与工程系本科生课程程序设计实习30/44运算符重载运算符重载建议建议原则原则•不要改变运算符的操作数的个数•不要改变运算符的优先级•不要改变运算符的结合性•不能改变运算符对基本数据类型的操作方式•重载运算符的意义要明确,不能有二义性•当重载运算符作为友函数时,则其形参中至少有一个是对象复旦大学计算机科学与工程系本科生课程程序设计实习31/44内容摘要内容摘要•静态类成员•C++的一些语言特性•运算符重载••模板函数和模板类模板函数和模板类•C++输入/输出流复旦大学计算机科学与工程系本科生课程程序设计实习32/44模板函数模板函数•函数模板是生成函数代码的样板,其中包含参数化类型名,这样具有类似特性的类或数据类型可以共享一样的操作函数•C++编译程序
本文标题:3-3.C++面向对象程序设计―C++的其它语言特性
链接地址:https://www.777doc.com/doc-5319317 .html