1、C+练习题C+练习题(1)班级 姓名 学号 一、概念填空题1.1 类定义的关键字是 class 。类的数据成员通常指定为 私有 成员。类的函数成员通常指定为 公有 成员,指定为 公有 的类成员可以在类对象所在域中的任何位置访问它们,类的 私有 只能被该类的成员函数或友元函数访问。1.2 类的访问限定符包括 public 、 private 和 protected 。类成员默认的访问方式是 private 。访问限定符在类中 无 先后次序,各限定符 允许(允许/不允许)多次出现1.3 构造函数的任务是 创建对象 。类中可以有 多 个构造函数,它们由 参数 区分。如果类说明中没有给出构造函数,则C
2、+编译器会提供构造函数,该函数 完成 (完成/不完成)对象初始化工作。1.4复制构造函数的参数是 类对象引用 ,当程序没有给出复制构造函数时,编译系统会提供 默认复制构造函数 ,完成类对象的 复制 。复制构造函数被调用情况 3 种。1.5析构函数在对象 撤销 时被自动调用。类中没有定义析构函数时,编译系统会提供一个默认的析构函数。该函数 不完成 (完成/不完成)具体对象的清理工作。二、简答题2.1 为什么说类与对象的概念是客观世界的反映?答:现实世界每个个体有特征与行为,这些特征与方法抽象概括成为更高级的存在,如女人与男人可概括抽象为人类,人与动物概括抽象为生物等等而女人与男人,人与动物分别是
3、人类与生物的具体对象,有共同的地方,但也有差别,如女人与男人的性别,身体特征对象与类正是这种男人、女人与人类的概括抽象关系,类派的属性与方法,是对象的概括和抽象没有具体实现,但类声明的对象是类的具体实例,有各自的具体属性与方法,如汽车类创建的,奥迪q7,奥迪a4,不仅颜色不一样,连重量与车型也有差别。2.2 简单解释什么是面向对象程序设计的封装性。答:封装性具体是指类对属性与方法的隐藏,在类的外部,尽管可以创建对象实例,但对其本身的属性与方法有不同的访问权限,不能直接访问某部分属性与方法,必须通过类的接口实现对属性与方法的访问。总的来说,封装性指对属性和方法的隐藏,唯有通过其提供的借口才能够访
4、问。2.3 引用作为函数参数时为什么能实现两个实参之间的数据交换?为什么对应实参不能为引用?为什么返回值为引用的函数可以作为左值?答: 引用是对实体的间接操作,不存在另外的内存,且可以改变实体的内容,但前提是引用具有实体。所以引用做参数时,对引用的操作可以看做对实体的操作,即实现了两个实参之间的数据交换。引用做参数时,实参是实体,但实参是引用后,引用是没有内存的,即不可以作为实体,所以对应实参不能为引用。2.4 什么是默认的构造函数?默认的构造函数可以有多少个?答:默认的构造函数指没有用户自定义的构造函数时,系统提供的无参,没有函数体的只用来创建对象的构造函数。默认的构造函数只有一个。2.5
5、为什么在友元函数的函数体内访问对象成员时,必须用对象名加运算符“.”再加对象成员名?答:友元函数不属于类的成员函数,即不可以直接访问对象的成员,必须通过对象来进行访问,但特殊的,与成员函数一样,对象的成员对其没有访问限制。2.6 类的静态数据成员与函数中的静态成员有何异同?答:类的静态成员为所有的对象共享,可以直接或通过接口访问,且只有唯一内存。函数的静态成员只在函数体内有效(局部变量),但其只作一次声明,每次进入该函数都保存上一次的操作,直到程序结束才释放内存。2.7 类的成员函数在什么情况下应该定义为私有的?这样做的目的是什么?答:类要创建对象必须调用构造函数,所以构造函数不能定义为私有,
6、同理,析构函数也不能定义为私有,且类的接口函数不能为私有。目的是为了阻止类外部对其的访问,保证了其的封装性。2.8 友元关系有何性质?友元关系的优点和缺点各有哪些?答:可以不受类的访问限制,它可以直接访问私有成员,方便了数据的数据的交换但破坏了类特有的封装性。三、选择题3.1 数据封装就是将一组数据和与这组数据有关操作组装在一起,形成一个实体,这实体也就是(B )。A类 B对象 C函数体 D数据块3.2 类的实例化是指( B )。A定义类 B创建类的对象 C指明具体类 D调用类的成员3.3下列说法中正确的是(B)。A类定义中只能说明函数成员的函数头,不能定义函数体 B类中的函数成员可以在类体中
7、定义,也可以在类体之外定义 C类中的函数成员在类体之外定义时必须要与类声明在同一文件中 D在类体之外定义的函数成员不能操作该类的私有数据成员3.4有如下类定义:class sample int n; public: sample (int i=0):n(i) void setValue(int n0); ; 下列关于setValue成员函数的实现中,正确的是(B)。Asample:setValue(int n0)n=n0;Bvoid sample:setValue(int n0)n=n0;Cvoid setValue(int n0)n=n0;DsetValue(int n0)n=n0;3.5在
8、下面的类定义中,错误的语句是( C )。class sample public: sample(int val); / sample( ); / private: int a=2.5; / public: sample( ); / ; A B C D3.6类的构造函数被自动调用执行的情况是在创建该类的(C)。 A成员函数时 B数据成员时 C对象时 D友元函数时3.7(A)是析构函数的特征。 A一个类中只能定义一个析构函数 B析构函数名与类名不同 C析构函数的定义只能在类体内 D析构函数可以有一个或多个参数3.8 在下列函数原型中,可以作为类AA构造函数的是(D)。 Avoid AA(int);
9、 Bint AA( ); CAA(int) const; DAA(int)3.9关于成员函数特征的下述描述中,(A)是错误的。 A成员函数一定是内联函数 B成员函数可以重载 C成员函数可以设置参数的默认值 D成员函数可以是静态的3.10不属于成员函数的是( B )。 A静态成员函数 B友元函数 C构造函数 D析构函数3.11已知类A是类B的友元,类B是类C的友元,则(D)。 A类A一定是类C的友元 B类C一定是类A的友元 C类C的成员函数可以访问类B的对象的任何成员 D类A的成员函数可以访问类B的对象的任何成员3.12有如下类定义: class AA int a; public: int ge
10、tRef( ) const return &a; /返回类型为int, return &a为地址 int getValue( ) const return a; / void set(int n) consta=n; /常函数不能修改成员 friend void show(AA aa) const couta=a;/常函数不能修改成员 void h(int b) Test:b=b; / static int g( ) return a; /静态函数要通过对象访问成员 private: int a; static int b; const int c; ;int Test:b=0; 在标注号码的
11、行中,能被正确编译的是(C)。 A B C D四、写出程序程序执行结果。4.1 写出下列程序的运行结果。#include using namespace std;class Test public: Test( ) n+=2; Test( ) n-=3; static int getNum( ) return n; private: static int n; ;int Test:n=1;int main( ) Test* p = new Test; delete p; cout”n=”Test:getNum( )endl; return 0; n=04.2写出下列程序的运行结果。#inclu
12、de using namespace std;class AA int n; public: AA(int k):n(k) int get( ) return n; int get( ) const return n+1; ;int main( ) AA a(5); const AA b(6); couta.get()“,”b.get(); return 0; 5,74.3写出下列程序的运行结果。#include using namespace std;class MyClass public: int number; void set(int i); ;int number=3;void M
13、yClass:set (int i) number=i;void main( ) MyClass my1; int number=10; my1.set(5); coutmy1.numberendl; my1.set(number); coutmy1.numberendl; my1.set(:number); coutmy1.number; 51034.4写出下列程序的运行结果。#include using namespace std;class Test private: static int val; int a; public: static int func( ); void sfun
14、c(Test &r); ;int Test:val=200;int Test:func( ) return val+; void Test:sfunc(Test &r) r.a=125; coutResult3=r.aendl; void main( ) coutResult1=Test:func( )endl; Test a; coutResult2=a.func()endl; a.sfunc(a); Result1=200Result2=201Result3=125五、编程题5.1 构造一个日期时间类(Timedate),数据成员包括年、月、日和时、分、秒,函数成员包括设置日期时间和输出时
15、间,其中年、月用枚举类型,并完成测试(包括用成员函数和用普通函数)。5.2 定义一个日期类Date,具有年月日等数据成员,显示日期、加减天数等函数成员。注意需要考虑闰年。5.3 定义一个圆类(Circle),属性为半径(radius)、圆周长和面积,操作为输入半径并计算周长、面积,输出半径、周长和面积。要求定义构造函数(以半径为参数,默认值为0,周长和面积在构造函数中生成)和复制构造函数。5.4 设计一个学校在册人员类(Person)。数据成员包括身份证号(IdPerson)、姓名(Name)、性别(Sex)、生日(Birth-day)和家庭住址(HomeAddress)。成员函数包括人员信息
16、的录入和显示,还包括构造函数与复制构造函数。设计一个合适的初始值。5.5 设计如下类:(1)建立一个Point类,表示平面中的一个点;建立一个Line类,表示平面中的一条线端,内含两个Point类的对象;建立Triangle类,表示一个三角形,内含三个Line类的对象构成一个三角形。(2)设计三个类的相应的构造函数、复制构造函数,完成初始化和对象复制(3)设计Triangle类的成员函数完成三条边是否能构成三角形的检验和三角形面积计算,面积显示。5.6 建立一个分数类Fraction。分数类的数据成员包括分子和分母。成员函数包括构造函数、复制构造函数。构造函数要对初始化数据进行必要的检查(分母
17、不能为0)。将分数显示成 “a/b”形式的输出函数。成员函数包括约分、通分、加、减、乘、除、求倒数、比较大小、显示和输入。完成以上所有成员函数并在主函数中进行检验。/5.1 Timedate.cpp#include using namespace std;enum YearY1992,Y1993,Y1994,Y1995;enum MonthJan,Feb,Mar,Apr,May,Jun;class Timedate Year year; Month month; int day,hour,minute,second;public: void setTimedate(Year,Month,int
18、,int,int,int); void display();void Timedate:setTimedate(Year y,Month m,int d,int h,int mi,int s) year=y; month=m; day=d; hour=h; minute=mi; second=s;void Timedate:display() couttime: hour:minute:secondendl;void main() Timedate timedate; timedate.setTimedate(Y1992,Jan,33,12,9,9); timedate.display();/
19、5.2 Date.cpp#include using namespace std;class Date int year,month,day;public: void display(); void setTate(); int inputDay(); void setDay(int days); int isLeapyear();void Date:display() coutyear年month月day日endl;void Date:setTate() coutyearmonthday;int Date:inputDay() int days; coutdays; return days;
20、void Date:setDay(int days) int flag=0; day=day+days; if(isLeapyear() flag=1; while(day28) if(month%2!=0&month7) if(day12) month=month-12; year=year+1; else if(month=4|month=6|month=9) if(day=30) break; else day=day-30; month=month+1; else if(month=2) if(flag=1) if(day=29) break; else day=day-28; mon
21、th=month+1; else break; int Date:isLeapyear() if(year%400=0|year%100!=0&year%4=0) return 1; else return 0;void main() Date date; date.setTate(); date.display(); date.setDay(date.inputDay(); date.display();/5.3 Circle.cpp#include using namespace std;const double PI=3.14156;class Circle double radius,
22、circumference,area;public: Circle(double); Circle(const Circle &); /double outputRadius(); void display();Circle:Circle(double r=0) radius=r; area=PI*radius*radius; circumference=2*PI*radius;Circle:Circle(const Circle &circl) radius=circl.radius; area=circl.area; circumference=circl.circumference;void Circle:display() coutradius=radiusendl; coutarea=areaendl; coutcircumference=circumferencer; Circle circle(r); circle.display();
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1