您好,欢迎访问三七文档
第三章[3_1]类声明的一般格式是什么?答:类声明的一般格式如下:class类名{public:公有数据成员;公有成员函数;protected:保护数据成员;保护成员函数;private:私有数据成员;私有成员函数;};其中:class是声明类的关键字;类名是要声明的类的名字;后面的花括号表示出类声明的范围;最后的分号表示类声明结束。[3_2]构造函数和析构函数的主要作用是什么?它们各有什么特性?答:构造函数是一种特殊的成员函数,它主要用于为对象分配空间,进行初始化。构造函数具有一些特殊的性质:(1)构造函数的名字必须与类名相同(2)构造函数可以有任意类型的参数,但不能指定返回类型。它有隐含的返回值,该值在系统内部使用。(3)构造函数是特殊的成员函数,函数体可写在类体内,也可写在类体外。(4)构造函数可以重载,即一个类中可以定义多个参数个数或参数类型不同的构造函数。(5)构造函数被声明为公有函数,但它不能象其它成员函数那样被显示地调用,它是在定义对象的同时被调用的。析构函数也是一种特殊的成员函数。它执行与构造函数相反的操作,通常用于撤消对象时的一些清理任务,如释放分配给对象的内存空间等。析构函数有以下一些特点:(1)析构函数与构造函数名字相同,但它前面必须加一个波浪号(~)(2)析构函数没有参数,不能指定返回类型,而且不能重载。因此在一个类中只能有一个析构函数。(3)当撤消对象时,编译系统会自动地调用析构函数。[3_3]什么是对象数组?答:所谓对象数组是指每一数组元素都是对象的数组,也就是说,若一个类有若干个对象,我们把这一系列的对象用一个数组来存放。对象数组的元素是对象,不仅具有数据成员,而且还有函数成员。[3_4]什么是this指针?它的主要作用是什么?答:C++为成员函数提供了一个名字为this的指针,这个指针称为自引用指针。每当创建一个对象时,系统就把this指针初始化为指向该对象。每当调用一个成员函数时,系统就自动把this指针作为一个隐含的参数传给该函数。不同的对象调用同一个成员函数时,C++编译器将根据成员函数的this指针所指向的对象来确定应该引用哪一个对象的数据成员。[3_5]友元函数有什么作用?答:友元函数不是当前类的成员函数,而是独立于当前类的外部函数,但它可以访问该类的所有对象的成员,包括私有成员和公有成员。通过友元函数可以在不放弃私有数据安全的情况下,使得类外部的函数能够访问类中的私有成员。当一个函数需要访问多个类时,友元函数非常有用,普通的成员函数只能访问其所属的类,但是多个类的友元函数能够访问相应的所有类的数据。此外,在某些情况,例如运算符被重载时,需要用到友元函数。[3_6]假设在程序中已经声明了类point,并建立了其对象p1和p2。请回答以下几个语句有什么区别?答:(1)pointp1,p2;用带缺省参数的构造函数或不带参数的构造函数,定义了point类的2个对象p1和p2。(2)pointp2=p1;依据已存在的对象p1,用赋值形式调用拷贝构造函数,创建对象p2。(3)pointp2(p1);依据已存在的对象p1,用显示调用拷贝构造函数,创建对象p2(4)p2=p1;对象赋值语句,将对象p1数据成员的值拷贝到对象p2中。[3_7]B说明:C++中对构造函数有一些规定:不能带返回值;可以不带参数;也可以缺省定义;但构造函数的名字与类名必须完全相同。[3_8]C说明:C++中没有限定private、public、protected的书写次序。但是,不能在类的声明中给数据成员赋初值,数据成员的数据类型也不能是register(寄存器类型),没有用private、public、protected定义的数据成员是私有成员。[3_9]C说明:C++中对析构函数也有一些规定:没有参数;不能重载;析构函数的名字是在类名前加“~”;析构函数不能指定返回类型。[3_10]B说明:构造函数的工作是在创建对象时执行的。[3_11]B说明:C++中规定在建立对象前,就可以为静态数据成员赋值。同时规定在静态成员函数中不能使用this指针。静态成员函数在类外定义时,不需要用static前缀。静态成员函数即可以在类内定义也可以在类外定义[3_12]A说明:在C++中友元函数是独立于当前类的外部函数,一个友元函数可以同时定义为两个类的友元函数。友元函数即可以在类的内部也可以在类的外部定义,而在外部定义友元函数时,不必加关键字friend[3_13]A说明:由于友元函数可以直接访问对象的私有成员,所以友元的作用是提高程序运行的效率[3_14]B[3_15]A[3_16]B[3_17]B[3_18]答:运行结果是:10,2030,4850,6870,8090,1611,120[3_19]答:运行结果是:Constructing10Destructing.100Destructing[3_20]答:运行结果是:3objectsinexistence4objectsinexistenceafterallocation3objectsinexistenceafterdeletion说明:这个程序使用静态数据成员追踪记载创建对象的个数。完成这一工作的方法就是每创建一个对象就调用构造函数一次。每调用构造函数一次,静态数据成员total就增加1,每撤消一个对象就调用析构函数一次。每调用析构函数一次,静态数据成员total就减少1。[3_21]答:运行结果是:Countingat0Countingat1Countingat2Countingat3Countingat4Countingat5Countingat6Countingat7Countingat8Countingat9说明:在程序中main()只包括了一个return语句,但竟然有内容输出!什么时候调用了构造函数?构造函数在对象被定义时调用。那么对象anObject是何时被调用的呢?是在main()之前,语句”testanObject”处。因此,anObject的构造函数是先于main()被调用的。在main()之前的所有全局变量都是在main()开始之前就建立了的。应该尽可能避免使用全局变量,因为全局变量有可能引起名称冲突,使程序的执行结果和预想的不一样。[3_22]答:Defaultconstructorcalled.Defaultconstructorcalled.Defaultconstructorcalled.Constructor:a=1,b=2.Constructor:a=3,b=4.Constructor:a=5,b=6.[3_23]答:Con.Copycon.Default.[3_24]答:A=5B=14A=9B=14[3_25]答:5,722,25[3_26]答:ConstructingConstructingA=5B=15DestructingA=10B=15DestructingDestructingDestructing,,,,,,,,,,,,,,,,,[3_27]答:语句“p1.age=30”错。因为age是私有数据成员,类外不能直接访问。[3_28]答:1:printStu()和setSno()两个成员函数没有用public定义,不允许外部函数对对象进行操作;2:成员函数类外定义,应加类名“Student::”;3:setAge应在类内说明,即voidsetAge(inta);并且在类外定义时,应加类名“Student::”[3_29]答:构造函数Point是私有的,语句“Pointcpoint;”执行时出错。构造函数应定义为公有,否则,在创建对象时无法调用。[3_30]答:成员函数的程序如下:classcounter{public:counter(intnumber);//构造函数voidincrement();//给原值加1voiddecrement();//给原值减1intgetvalue();//取得计数器值intprint();//显示计数private:intvalue;};counter::counter(intnumber)//构造函数定义{value=number;}voidcounter::increment()//给原值加1{value++;}voidcounter::decrement()//给原值减1{value--;}intcounter::getvalue()//取得计数器值{returnvalue;}intcounter::print()//显示计数{coutvalueisvalueendl;return0;}[3_31]答:成员函数的程序如下:voidDate::printDate(){cout\nDateisyear.;coutmonth.dayendl;}voidDate::setDay(intd){day=d;}voidDate::setMonth(intm){month=m;}voidDate::setYear(inty){year=y;}[3_32]答:参考程序如下#includeiostreamusingnamespacestd;classcylinder{public:cylinder(doublea,doubleb);voidvol();private:doubler,h;doublevolume;};cylinder::cylinder(doublea,doubleb){r=a;h=b;volume=3.141592*r*r*h;}voidcylinder::vol(){coutvolumeis:volume\n;}intmain(){cylinderx(2.2,8.09);x.vol();return0;}[3_33]答:参考程序如下#includeiostreamusingnamespacestd;classbook{public:book(inta,intb){qu=a;price=b;}voidshow_money(){coutqu*price\n;}private:intqu,price;};intmain(){bookob[5]={book(1,10),book(2,20),book(3,30),book(4,40),book(5,50)};[3_33]题用下面语句inti;for(i=0;i5;i++)ob[i].show_money();return0;}[3_34]题用下面的语句inti;book*p;p=&ob[4];for(i=0;i5;i++){p-show_money();p--;}return0;}[3_35]答:参考程序如下#includeiostreamusingnamespacestd;constintSIZE=80;classStock{public:Stock(){strcpy(stockcode,“”);}Stock(charcode[],intq=1000;doublep=8.98){strcpy(stockcode,code);quan=q;price=p;}voidprint(){coutthis-stockcode””;coutthis-quan””;coutthis-price””;coutendl;}private:charstockcode[SIZE];intquan;doubleprice;};intmain(){Stockst1(“600001”,3000,5.67);st1.print();Stockst2(“600002”);st2.print();return0;}[3_36]答:参考程序如下#includeiostream#includestringusingnamespacestd;classStudent{public:Student(intn,stringna,doubled){no=n;name
本文标题:C++习题答案-3
链接地址:https://www.777doc.com/doc-2904191 .html