成员函数的参数有两种,一种是函数名后括号后声明的参数列表中的参数,一种是所有的数据成员,它不需要在函数体内声明就可以被所有的成员函数所使用。如果函数的普通参数是常量参数,则在函数体内不能对参数进行修改,而对于数据成员如果是只读方式使用,则需要使用C++中提供的const成员函数方式,即在函数的声明后加关键字“const”,这样限制成员函数修改数据成员的值。格式如下:
使用const数据成员可以保证在类的对象作用域范围内值不被改变,使用const成员函数可以使数据成员在成员函数体内不被改变,保证了数据的局部安全访问。
【例2.19】设计一个圆类,私有数据成员有半径和常量π(写为PI),成员函数有设置半径值、取得半径值、求圆的周长和求圆的面积,创建并使用圆类对象。
在此例中,对取得半径值、求圆面积和求圆的周长三个成员函数都设置为const成员函数,保证其中不对半径值进行修改。类的const成员函数不允许调用非const成员函数,因为如果const成员函数调用了非const成员函数,就是允许间接地对数据成员进行修改。同理当对象作为常量参数传递给函数时,其能够使用的成员函数必须是const成员函数,不能够使用非const成员函数,否则语法错误。
【例2.20】设计一个产品类,产品有属性有名称和单价,可以分别设置或获得名称和单价。要求设计名称类型为字符指针类型,为useProduct函数传递常量引用类型参数,并在函数中输出名称和单价。main函数中实例化对象并使用对象,调用useProduct函数。
重点提示
在定义时,对于不需修改数据成员的成员函数最定义为const员函数,这样从语法上规定修改数据成值,而不要依程序员的自觉对于const数成员使用时,在构造函数后用冒号语法始化。
综合实训
类与对象
【实训目的】
1.掌握类的定义,根据需求设计类。
2.深入理解C++中类的封装性。
3.灵活运用构造函数和析构函数。
4.掌握对象的各种成员的使用方法。
【实训内容】
1.设计一个圆柱类,要求数据成员有高度、半径;成员函数有设置半径和高度、求圆柱面积、求圆柱体积。要求设计类,并在main函数中创建对象,测试两个成员函数。
2.设计一个栈类,要求数据存放在堆空间,数据成员有栈底指针、栈顶指针、栈大小、栈元素个数;成员函数有构造函数、析构函数、出栈操作、进栈操作、清空栈操作等。其中要注意在构造函数中初始化栈,定义栈的大小并按照栈的大小分配合适的堆空间,在析构函数中要求把栈清空后再释放堆空间。要求设计类,并在main函数中创建对象,测试类中各个成员函数。
【实训设计】
1.参考代码
2.参考代码
项目小结
本项目中,我们学习了面向对象程序设计中的类和对象的基本知识。对象是包含事物的特征属性和事物行为的封装体,类是描述对象的数据类型,对象是类的实例化。类定义由数据成员和成员函数构成,数据成员用于描述对象的特征,成员函数用于描述对象的操作行为。成员的使用受访问控制符的限制,访问控制符若为public(公有的),则外部对象可以通过“对象.成员名”方式访问该成员;若为private(私有的)则仅内部成员可以使用该成员;若为protected(受保护的)则内部成员和它派生的子类(将在后继章节中讨论)成员可以使用。在类的成员函数中有两个特殊的成员,分别是构造函数和析构函数。构造函数用于创建对象,完成对象的初始化工作;析构函数用于释放对象,完成对象的收尾工作。构造函数与类名同名,没有返回值类型,构造函数可以重载,也可以默认参数,也可以没有构造函数。当没有构造函数时,系统添加默认的无参构造函数为对象的数据成员分配内存空间并初始化。析构函数是构造函数的“逆”,析构函数头为“~类名()”,析构函数也没有返回值,无参数,不可以重载。当没有编写析构函数时,系统添加默认的析构函数把对象的数据成员所占内存空间进行回收,但不能自动回收堆空间和释放在对象存在期申请的其他资源,所以如果对象有使用资源的情况,就需要添加析构函数来回收资源。类中的数据成员若用const修饰,则数据成员不可以改变,同时它的初始化必须采用冒号语法方式在构造函数头后进行初始化。类中的成员函数使用const修饰,则在成员函数内不能修改数据成员。
课后练习
一、填空题
1.对象是_____________和_____________的封装体。
2.对象是_____________的实例化。
3.类中有两种成员,分别为_____________和_____________。
4.当创建一个新的对象时,系统自动调用_____________来创建对象。
5.在C++中,每个对象都有一个特殊的隐含指针,这个指针用来存放当前对象的地址,它是_________指针。
6.类的访问控制符有三种分别为___________、___________、___________。
7.使用Class定义类时,缺省的访问控制符是_________,使用struct定义类时,缺省的访问控制符是___________。
8.当对象的生存期结束时,系统自动调用___________进行必要的清理工作,如释放内存空间和系统资源。
9.类TBook的析构函数名为_______________。
10.const修饰类的成员函数时,____________不能修改。
二、选择题
1.下面语句中,关于类内数据成员描述正确的是( )。
A.类内所有的数据成员可以通过“对象名.数据成员”方式使用
B.类内所有的数据成员可以被类内的成员函数使用
C.类内私有的数据成员可以通过“对象名.数据成员”方式使用
D.类内受保护的数据成员可以通过“对象名.数据成员”方式使用
2.关于构造函数描述错误的是( )。
A.构造函数的名称与类名相同
B.构造函数可以有默认参数
C.构造函数不可以有返回值,因为它的返回值类型为void
D.构造函数可以重载
3.关于析构函数描述正确的是( )。(www.daowen.com)
A.析构函数可以显式调用
B.析构函数没有返回值,它的返回值类型是void
C.析构函数可以有参数
D.析构函数不能重载
4.Book类的析构函数形式为( )。
A.void Book(){ ......//析构函数的语句}
B.~Book(){ ......//析构函数的语句}
C.~Book(int n){ ......//析构函数的语句}
D.void~Book(){ ......//析构函数的语句}
5.Book类的构造函数定义形式的正确是( )。
A.Book(){......//构造函数的语句}
B.void Book(){......//构造函数的语句}
C.void Book(char ∗pname,int p=32,char ∗ppublisher){......//构造函数的语句}
D.int Book(){......//构造函数的语句}
6.关于this指针,正确描述的是( )。
A.this指针指向当前对象
B.this指针必须显示说明
C.数据成员和成员函数都拥有this指针
D.this指针的值是对象的成员函数的地址值
7.当对象被撤销时,系统会自动调用( )。
A.拷贝构造函数 B.构造函数
C.析构函数 D.成员函数
8.类定义的外部,可以通过“对象名.成员”访问对象的,访问控制符的是( )。
A.public B.private
C.protected D.public和private
9.在Book类中,void get Msg(int a)const{......//成员函数操作}中的const表示( )。
A.函数中的形式参数a不可以修改
B.函数中的数据成员都不可以修改
C.函数中的数据成员可以修改
D.函数中的形式参数a和数成员都不可以修改
10.关于const数据成员描述正确的是( )。
A.const数据成员的初始化可以在构造函数中通过冒号语法赋值
B.const数据成员可以在声明数据成员时初始化
C.const数据成员可以构造函数中初始化
D.const数据成员仅在类内可以修改,类外不能修改
三、编程题
1.定义球类,数据成员有半径,成员函数有设置半径和求体积。设计类,并使用类。
2.定义矩形类,数据成员有长度和宽度,成员函数有计算矩形周长和计算矩形面积。在使用类时,可以根据长度和宽度构造矩形对象,并可以输出矩形的周长和面积。
3.定义复数类Complex,数据成员有实部和虚部,成员函数有(1)构造函数;(2)设置实部;(3)设置虚部;(4)取得实部值;(5)取得虚部值;(6)输出复数。在main函数中个定义一个复数对象,然后对所有的成员函数进行使用。
4.定义一个学生类,数据成员有学号、姓名、年龄,其中学号和姓名为字符指针类型,年龄为整型;成员函数有构造函数(带参数构造,根据学号、姓名和年龄构造,年龄默认18)、析构函数、取得/设置学号、取得/设置姓名、取得/设置年龄,输出学生信息。要求在main函数中,分别根据是否使用默认参数创建两个不同的学生对象,并使用它们的成员函数。
资源推荐
1.C++网站 http://www.cplusplus.com
2.C++类库参考 https://msdn.microsoft.com/zh-cn/library/cscc687y.aspx
3.百度传课 http://www.chuanke.com/course/72351176561000448______2.html
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。