当前位置:文档之家› 华科面向对象的程序设计题库

华科面向对象的程序设计题库

1、编译时的多态性通过__重载__函数实现。

2、面向对象的四个基本特性是_抽象__、__多态性_、__继承性__和_封装性_。

3. 假定AB为一个类,则执行“AB a(2), b[4],*p[4];”语句时调用该类构造函数的次数为__5__。

4.要实现动态联编必须通过对象指针或引用来调用_虚函数_实现。

5.在函数前面用_ inline _保留字修饰时,则表示该函数表为内联函数。

6. 如果将一个对象说明为常对象,则通过该对象只能调用它的__常成员__函数。

7、非成员函数应声明为类的__友元___函数才能访问这个类的private成员。

8、在用class定义一个类时,数据成员和成员函数的默认访问权限是_ 私有____。

9、运算符重载函数可能是类的_友元_函数,也可以是类的_成员_函数,还可以是普通函数。

10、__转换构造函数__函数可以将一个指定的数据转换为类的对象,_类型转换函数_函数实现类的对象转换成其它类型的数据。

11、静态多态性是通过函数重载、运算符重载、模板来实现。

12、假定AB为一个类,则执行“AB a(10), b[1],*p[10];”语句时调用该类构造函数的次数为 1 。

13、C++类成员函数有 public 、 private 、 protected 三种类型。

14、如果将一个对象说明为常对象,则通过该对象只能调用它的常成员函数。

15、为使外部函数可访问类的私有成员,需将该函数声明为该类的友元函数。

16、类B是由类A以保护方式派生的,则类A中公有访问属性的数据成员在类B中的访问属性为保护。

17、+、=、[]、->等四种运算符中,可采用友元函数重载的运算符是 + 。

18、抽象类是指具有纯虚函数的类,它只能作为基类来使用。

19、类B是由类A以保护方式派生的,则类A中私有访问属性的数据成员在类B中的访问属性为不可访问。

1、什么是类模板,类模板声明的一般形式是什么?答案:类模板是对一批仅仅成员数据类型不同的类的抽象,程序员只要为这一批类所组成的整个类家族创建一个类模板,给出一套程序代码,就可以用来生成多种具体的类,(这类可以看作是类模板的实例),从而大大提高编程的效率。

定义类模板的一般形式是:template <类型名参数名1,类型名参数名2,…>class 类名{类声明体};2、有哪几种继承方式?每种方式的派生类对基类成员的继承性如何?答案:继承方式包括:public、private、protected。

3、简述运算符重载的实现方式有哪几种?给出对应的声明语法形式。

答案:(1)类外定义的运算符重载函数格式为:friend <返回类型> operator <op>(<类型> 参数1,<类型> 参数2){ <函数体> }(2)成员运算符重载函数<返回类型> <类名>::operator <op> (<类型> 参数){ <函数体> }4、什么是this指针? 它的主要作用是什么?答案:this指针:隐含在非静态成员函数中的特殊指针,它是当前正在调用此成员函数的对象的指针。

作用:主要是用于保证访问不能跨界和用于区分不同的对象。

成员函数对成员变量的引用实际是通过this指针访问的,也就是说:成员变量this->成员变量;另外,如果成员函数需要访问当前对象,也可以通过this指针,*this就是当前对象。

5、什么是多继承?多继承时,构造函数和析构函数执行顺序是怎样的?答案:多继承是指派生类具有多个基类,派生类与每个基类之间的关系仍可看作是一个单继承。

派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类时指定的各基类顺序),再执行派生类的构造函数,析构函数执行顺序,与构造函数完全相反。

三、写出程序运行结果1、#include<iostream>using namespace std;class B1{int b1;public:B1(int i){ b1 = i; cout <<"constructor B1."<<i<<endl; } void print(){ cout<<b1<<endl; }};class B2{int b2;public:B2(int i){ b2 = i; cout<<"constructor B2."<<i<<endl; } void print(){ cout<<b2<<endl; }};class B3{int b3;public:B3(int i){ b3 = i; cout<<"constructor B3."<<i<<endl; }int getb3(){ return b3; }};class A:public B2, B1{int a; B3 bb;public:A(int i,int j, int k, int l):B1(i),bb(k),B2(j){ a=l;cout<<"constructor A."<<l<<endl;}void print(){B1::print();B2::print();cout<<a<<","<<bb.getb3()<<endl;}};int main(){A aa(1,2,3,4);aa.print();return 0;}答案:constructor B2.2constructor B1.1constructor B3.3constructor A.4124,32、#include <iostream>#include <string.h>using namespace std;class A {char string[80];public :void show();A(char * st);~A( );};A::A(char * st){ strcpy(string, st);cout << string << "[构造]" << endl;}A::~A( ){ cout << string << "[析构]" << endl; }void A::show(){cout << string << endl;}void fun( ){cout << "1 fun内" << endl;A fun_Obj("2 fun内自动对象fun_Obj");static A fun_sta_Obj("3 fun内静态对象fun_sta_Obj"); }void main( ){A *ptrA = new A("4 main内动态分配对象m_all_Obj"); if(ptrA==NULL) return;ptrA->show();cout<<"5 main内调用fun函数"<< endl;fun( );delete ptrA;}static A g_sta_Obj("6 外部静态对象g_sta_Obj");A g_glb_Obj("7 外部对象g_glb_Obj");答案:6 外部静态对象g_sta_Obj[构造]7 外部对象g_glb_Obj[构造]4 main内动态分配对象m_all_Obj[构造]4 main内动态分配对象m_all_Obj5 main内调用fun函数1 fun内2 fun内自动对象fun_Obj[构造]3 fun内静态对象fun_sta_Obj[构造]2 fun内自动对象fun_Obj[析构]4 main内动态分配对象m_all_Obj[析构]3 fun内静态对象fun_sta_Obj[析构]7 外部对象g_glb_Obj[析构]6 外部静态对象g_sta_Obj[析构]3、#include <iostream>using namespace std;class A{public:virtual void Print(int a, int b=4){ cout << "a = " << a << " , b = " << b << endl; } };class B : public A {public:virtual void Print(int a){ cout << "a = " << a << endl; }virtual void Print(int a, double d){ cout << "a = " << a << " , d = " << d << endl; } };void Show(A * p){p -> Print( 2 );p -> Print( 2, 6.9 );}void main( ){A * pa = new A;B * pb = new B;Show(pa);Show(pb);delete pa;delete pb;}答案:a = 2 ,b = 4a = 2 ,b = 6a = 2 ,b = 4a = 2 ,b = 64、#include <iostream.h>#include <string.h>class Person {char * pName;public :Person(char * pN){ static int j = 0;cout<< "第"<< ++j<< "次调用类型转换构造函数!\n"; pName = new char[strlen(pN) + 1];if(pName) strcpy(pName, pN);}Person(Person & p);Person & operator = (Person & s);~ Person( ){ static int k = 0;cout << "第"<< ++k<< "次调用析构函数!\n";pName[0] = '\0';delete pName;}void Display( ){ cout << pName << endl; }};Person::Person(Person & p){ cout << " 调用复制构造函数!\n";pName=new char[strlen(p.pName)+ 1];if(pName) strcpy(pName, p.pName);}Person& Person::operator = (Person & s) { cout << "调用赋值运算符函数!\n";if(pName) {delete pName;pName = '\0';}pName=new char[strlen(s.pName) + 1];if(pName) strcpy(pName , s.pName);return * this;}void main( ){Person p1("OldObject");Person p2 = p1;p1.Display( );p2.Display( );Person p3("NewObject");p3.Display( );p3 = p1;p3.Display( );}答案:第1次调用类型转换构造函数!调用复制构造函数!OldObjectOldObject第2次调用类型转换构造函数!NewObject调用复制构造函数!OldObject第1次调用析构函数!第2次调用析构函数!第3次调用析构函数!5、#include <iostream>using namespace std;class A{public:A() {m_nValue = -1;}A(int n) {m_nValue = n;}int m_nValue;};class B: virtual public A{public:B(int nB, int nA) : A(nA) {m_nValueB = nB;} int m_nValueB;};class C: virtual public A{public:C(int nC, int nA) : A(nA) {m_nValueC = nC;}int m_nValueC;};class D: public B, C{public:D(int nA, int nB, int nC, int nD) : C(nC, nA+20), B(nB, nA+10), A(nA+30){m_nValueD = nD;cout<< "(A,B,C,D)= "<< m_nValue << ","<<m_nValueB<< ","<< m_nValueC<< "," << m_nValueD<<endl;}int m_nValueD;};void main() { D dd(1, 2, 3, 4); }答案:(A,B,C,D)= 31,2,3,46、#include <iostream.h>#include <string.h>class Student {char name[20];public :Student(char * n){ strcpy(name, n);cout << " I am " << name << “ .\n”; }~Student(void){ cout << name << “ says goodbye !" << endl; }};void main( ){Student student[3] = {"WangWei", "LiLin", "ZhangFeng"};}答案:I am WangWeiI am LiLinI am ZhangFengZhangFengsays goodbye !LiLinsays goodbye !WangWeisays goodbye !7、#include<iostream.h>class Sample{char c1,c2;public:Sample(char a){c2=(c1=a)-32;}void disp(){cout<<c1<<"转换为"<<c2<<endl;}};void main(){Sample a('a'),b('b');a.disp();b.disp();}答案:a转换为Ab转换为B8、#include <iostream.h>class Counter{static long counter;public :Counter( ){ counter++; }long GetCounter( ) { return counter; }~Counter( ){ counter--; }};long Counter::counter = 5;Counter c1, c2, c3;void main( ){ cout<<"(1)The object counter is %d"<< c3.GetCounter( ))<<endl;Counter c4,c5,c6;Cout<<"(2)The object counter is %d"<< c5.GetCounter( ))<<endl;}答案:(1) The object counter is 8(2) The object counter is 119、#include<iostream.h>class Sample{int n;public:Sample(){}Sample (int m){n=m;}friend void square(Sample &s){s.n=s.n*s.n;}void disp(){cout<<"n="<<n<<endl;}};void main(){Sample a(10);square(a);a.disp();}答案:n=10010、#include<iostream.h>class Sample{int x;public:Sample(){ };Sample(int a){x=a;}Sample(Sample &a){x=a.x++ +10;}void disp() {cout<<"x="<<x<<endl;} };void main(){Sample s1(2), s2(s1);s1.disp();s2.disp();}答案:x=3x=1211、#include <iostream>#include <string>using namespace std;class Person{public:Person(char *nam,int ag){ strcpy(name,nam); age = ag;cout<<"Person类构造函数---"<<name<<endl;}Person(char *nam){ strcpy(name,nam);cout<<"Person类构造函数(char *nam)---"<<name<<endl;}~Person(){cout<<"Person类析构函数---"<<name<<endl;}void display(){cout<<"姓名:"<<name<<endl;}protected:char name[100];int age;};class Teacher: public Person // 声明Teacher(教师)类{public: // 公用部分Teacher(char *nam,int a,char *t):Person(nam,a) // 构造函数 { strcpy(title,t);cout<<"Teacher类构造函数"<<endl;}~Teacher(){cout<<"Teacher类析构函数"<<endl;}void display1() // 输出教师有关数据{cout<<"姓名:"<<name<<endl;cout<<"年龄"<<age<<endl;cout<<"职称:"<<title<<endl;}protected: // 保护部分char title[10]; // 职称};{public:Student(char *nam,char s,float sco):Person(nam){ sex=s; score=sco;cout<<"Student类构造函数---"<<name<<endl;}Student(char *nam, char s):Person(nam){ sex=s;cout<<"Student类构造函数---班长:"<<name<<endl;}~Student(){cout<<"Student类析构函数---"<<name<<endl;}void display2() // 输出学生有关数据{cout<<"姓名:"<<name<<endl;cout<<"性别:"<<sex<<endl;cout<<"成绩:"<<score<<endl;}char *get_name(){return name;}protected: // 保护部分char sex;float score; // 成绩};class Graduate: public Teacher, public Student{public:Graduate(char *nam,int a,char s,char *t,float sco,floatw):Teacher(nam,a,t),Student(nam,s,sco),wage(w),monitor("Li Ming",'m') {cout<<"Graduate类构造函数"<<endl;}~Graduate(){cout<<"Graduate类析构函数"<<endl;}void show( ) // 输出人员的有关数据cout<<"name:"<<Student::name<<endl;cout<<"age:"<<Student::age<<endl;cout<<"sex:"<<sex<<endl;cout<<"score:"<<score<<endl;cout<<"title:"<<title<<endl;cout<<"wages:"<<wage<<endl;cout<<"monitor:"<<monitor.get_name()<<endl;}Student monitor;private:float wage; // 工资};class Doctor:public Graduate{public:Doctor(char *nam,int a,char s,char *t,float sco,float w,char *tutor): Graduate(nam,a,s,t,sco,w){ strcpy(tutor_name, tutor);cout<<tutor_name<<endl;}private:char tutor_name[20];};int main(){Doctor d("Wang-li",24,'f',"assistant",89.5,1234.5,"Wang-wu");return 0;}答案:Person类构造函数---Wang-liTeacher类构造函数Person类构造函数(char *nam)---Wang-liStudent类构造函数---Wang-liPerson类构造函数(char *nam)---Li MingStudent类构造函数---班长:Li MingGraduate类构造函数Wang-wuGraduate类析构函数Student类析构函数---Li MingPerson类析构函数---Li MingStudent类析构函数---Wang-liPerson类析构函数---Wang-liTeacher类析构函数12、#include <iostream>using namespace std;class A{public:virtual void Print(int a, int b=5){ cout << "a = " << a << " , b = " << b << endl; } };class B : public A {public:virtual void Print(int a){ cout << "a = " << a << endl; }virtual void Print(int a, double d){ cout << "a = " << a << " , d = " << d << endl; } };void Show(A * p){p -> Print( 2, 6.9 );p -> Print( 2 );}void main( ){A * pa = new A;B * pb = new B;Show(pa);Show(pb);delete pa;delete pb;}答案:a = 2 , b = 6a = 2 ,b = 5a = 2 ,b = 6a = 2 ,b = 5四、补全程序题1、完成下面类中成员函数的定义。

相关主题