C++考试题带答案-面向对象部分

  • 一、选择填空题(20分,每题2分)

1. 下列关于指针的操作中,错误的        

A. 两个同类型的指针可以进行比较运算 B. 可以用一个空指针赋给某个指针 

C. 一个指针可以加上两个整数之差     D. 两个同类型的指针可以相加 

2. 构造函数不具备的特征的是        

A. 构造函数的函数名与类名相同   B. 构造函数可以重载 

C. 构造函数必须指定类型说明     D. 构造函数可以设置默认参数

3. 已知类 A 是类 B 的友元,类 B 是类 C 的友元,则          

A. 类 A 一定是类 C 的友元 

B. 类 C 一定是类 A 的友元 

C. 类 C 的成员函数可以访问类 B 的对象的任何成员 

D. 类 A 的成员函数可以访问类 B 的对象的任何成员 

4. 如果class类中的所有成员在定义时都没有使用关键字public、private或protected,则所有成员缺省定义为            

A.public     B.private    C.protected     D.static 

5. 所谓数据封装就是将一组数据和与这组数据有关操作组装在一起,形成一个实体,这实体也就是             

A. 类 B. 对象    C. 函数体     D. 数据块 

6. 若x是整型变量,pb是基类型为整型的指针变量,则正确的赋值表达式

    

 A) pb=&x     B) pb=x;   C) *pb=&x;        D) *pb=*x

7.有关类和对象的说法下列不正确的有    

A、对象是类的一个实例

B、任何一个对象只能属于一个具体的类

C、一个类只能有一个对象 

D、类与对象的关系和数据类型和变量的关系相似

8.对于int *pa[5];的描述,   是正确的。

A.pa是一个指向数组的指针,所指向的数组是 5个 int 型元素

B.pa 是一个指向某数组中第5个元素的指针,该元素是 int型变量

C.pa[5]表示某个数组的第5个元素的值

D.pa 是一个具有5个元素的指针数组,每个元素是 int 一个型指针

9. 面向对象的程序设计语言必须具备的关键要素是          

A. 抽象和封装                   B. 抽象和多态性  

C. 抽象、封装、继承和多态性     D. 抽象、封装和继承性 

10.派生类的对象只能对它的           是可访问的。

A.公有继承的公有成员     B.公有继承的私有成员

C.公有继承的保护成员     D.私有继承的保护成员

二、阅读以下程序并给出执行结果(15分)

1.

# include <iostream.h>

# include <string.h>

class  visiter   

{

public:

    static int glob;    

    void  set_mes (char *a);  

    void display();

private:

    int   number;    

    char  *name;             

} ;

void visiter :: set_mes (char *a) 

{

    name = new  char[strlen(a) + 1] ;

    strcpy (name, a) ;     

    number=++glob;         

}

void visiter ::display()

{

    cout << "  编号:"<<number << "  姓名:"<<name<<endl;

}

int  visiter :: glob= 0 ;     

void main () 

    visiter  person[5]; 

    int  i ;            

    char str[8] ;       

    cout << "  输入姓名:";

    for ( i=0; i<5; i++)   

    { 

       cin >> str ; 

        person[i].set_mes ( str ) ;      

    }

    cout<<endl;

    for ( i=0; i<5; i++)    

    { 

       person[i].display();

    }

}

输入姓名:A B C D E

输出:?

2.

#include<iostream.h>

class Point

{

 private:

   int X,Y;

public:

  Point(int a=0,int b=0){

        X=a;Y=b;

        cout<<"initializing X="<<X<<",Y="<<Y<<endl;

              }

  Point(Point &p);

  int GetX(){return X;}

  int GetY(){return Y;}

  void Show(){

        cout<<"X="<<X<<",Y="<<Y<<endl;

              }

  ~Point(){

       cout<<"delete…  "<<X<<","<<Y<<endl;

       }

};

Point::Point(Point &p){

   cout<<"Copy Initializing "<<p.X<<","<<p.Y<<endl;

   X=p.X;

   Y=p.Y;

}

void display(Point p){

   p.Show();

   }

void main(void)

{

Point A(24,116);  

cout<<"called display(A)"<<endl;

display(A); 

cout<<"out…"<<endl;   

}

3.

#include <iostream.h>

class Base

{

private:

       int x;

public:

       Base(int a)

       {

              cout<<"constructing Base..."<<endl;

              x=a;

       }

       ~Base()

       {

              cout<<"destructing Base..."<<endl;

       }

};

class Myclass

{

private:

       int n;

public:

       Myclass(int num)

       {

              n=num;

              cout<<"constructing Myclass..."<<endl;

       }

       ~Myclass()

       {

              cout<<"destructing Myclass..."<<endl;

       }

};

class Derive:public Base

{

private:

       int y;

       Myclass bobj;

public:

       Derive(int a,int b,int c):bobj(c),Base(a)

       {

              cout<<"constructing Derive..."<<endl;

              y=b;

       }

       ~Derive()

       {

              cout<<"destructing Derive..."<<endl;

       }

};

void main()

{

       Derive dobj(1,2,3);

}

三、阅读以下程序并简要叙述其功能(15分,每小题5分)

1.

#include <iostream.h>

void cal(const char *p,int &num);

void main()

{

        char str[100];

        int m;

        cin.getline(str,100);

        cal(str,m);

        cout<<m<<endl;

}

void cal(const char *p,int &num)

{

        num=0;

        for(; *p; p++, num++);

}

输入:This is funning

试写出运行结果并说明函数cal( )的功能。

2.试写出下列程序的运行结果及其功能。

#include <iostream.h>

struct student

{

        int num;

        char name[20];

        char sex;

        int age;

};

student fun(student *,int);

student stu[3]={{1,"lilin",'M',18},{2,"sunny",'M',24},{3,"zhao",'M',20}};

void main(void)

{

        student stud;

        stud=fun(stu,3);

       cout<<stud.num<<'\t'<<stud.name<<'\t'<<stud.age<<endl;

}

student fun(student *s,int n)

{

        int m=0,i=1;

        while (i<n)

        {

                if (s[m].age<s[i].age)

                        m=i;

                i++;

        }

        return s[m];

}

3. 简述String类中Setc、Getc和Append三个函数的功能。

#include<iostream.h>

#include<string.h>

class String

{

public:

  String(){Length=0;Buffer=0;}

  String(const char* str);

  void Setc(int index,char newchar);

  char Getc(int index) ;

  int GetLength() {return Length;}

  void Print()

  {

        if(Buffer==0) 

                cout<<"empty.\n";

        else

                cout<<Buffer<<endl;

  }

  void Append(const char* Tail);

  ~String(){delete[] Buffer;}

private:

  int Length;

  char* Buffer;

};

String::String(const char*str)

{

  Length=strlen(str);

  Buffer=new char[Length+1];

  strcpy(Buffer,str);

}

void String::Setc(int index,char newchar)

{

  if(index>0&&index<=Length)

    Buffer[index-1]=newchar;

}

char String::Getc(int index)

{

  if(index>0&&index<=Length)

     return Buffer[index-1];

  else

     return 0;

}

void String::Append(const char* Tail)

{

  char* temp;

  Length+=strlen(Tail);

  temp=new char[Length+1];

  strcpy(temp,Buffer);

  strcat(temp,Tail);

  delete[] Buffer;

  Buffer=temp;

}

四、阅读以下程序并填空(填上正确的语法成分),使其成为完整的程序(10,每空2分)

假设原链表的结点是按学号(number)由小到大排列的。在已建立的学生链表中插入一新结点,使插入新结点后的链表仍然保持有序。

struct Student

{

    long number;

    float score;

    Student * next;

};

Student * Insert(Student * head, Student * stud)  //插入链表结点

{

    if(    (1)     )  //原链表为空链表

    {

       head=stud;

       stud->next=NULL;

       return(head);

    }

    if(               (2)               )  //结点的插入位置在链首

    {

       stud->next=head;

       head=stud;

       return(head);

    }

    //查找插入位置

    Student * pGuard=head;

while(                          (3)                          )

       pGuard=pGuard->next;

    //插入结点

                     (4)                 

                     (5)                

    return(head);

}

五、编程题(40%

1、假设有一个文本文件data.txt中存放了一篇文章,其中有英文字母、数字、汉字及标点符号,请编程统计并输出英文字母的个数及文本的总行数。

2、设计并测试一个反映产品销售情况的类Product。

该类含有三个私有数据成员:产品名称、产品单价、产品剩余量;

四个公有成员函数:构造函数、购买产品(要求对购买数量进行合法性检查,并显示应付款)、显示剩余产品数量、析构函数。

  • 选择填空题(20分,每题2分)

(1)    D     (2)    C    (3)   D     (4)   B     (5)    B     

(6)    A     (7)    C    (8)   D     (9)   C     (10)   A   

二、阅读以下程序,写出其运行结果(15分,每小题5分)

1、

编号:1      姓名:A

编号:2      姓名:B

编号:3      姓名:C

编号:4      姓名:D

编号:5      姓名:E

2、

initializing X=24,Y=116

called display(A)

Copy Initializing 24,116

X=24,Y=116

delete… 24,116

out…

delete… 24,116

3、

constructing Base...

constructing Myclass...

constructing Derive...

destructing Derive...

destructing Myclass...

destructing Base...

三、阅读以下程序并简要叙述其功能(15分,每小题5分)

1、

输出:15

函数cal( )的功能:求指定字符串的长度并通过参数num返回给主调函数。

2、

输出:2  sunny      24

功能:求所有同学中年龄最大的同学。

3、

Setc( ): 将Buffer中第 index 个元素的值用newchar替换

Getc( ): 返回Buffer中第 index个元素的值。

Append( ): 将字符串Tail连接到 Buffer的末尾。

四、阅读以下程序并填空(填上正确的语法成分),使其成为完整的程序(10分,每空2分)

(1)     head==NULL               

(2)     head->number > stud->number              

(3)     pGuard->next && pGuard->next->number < stud->number        

(4)     stud->next=pGuard->next;              

(5)     pGuard->next=stud;              

五、编程题(40分,每题20分)

1.

#include <iostream.h>

#include <fstream.h>

#include <string.h>

void main()

{

    char str[128];

    int countLine=0,countChar=0;

    unsigned int i;

    ifstream fin("data.txt",ios::nocreate);

    if (fin.fail())

    {

        cerr<<"失败!!!"<<endl;

    }

    else

    {

      while(!fin.eof()){

        countLine++;

        fin.getline(str,sizeof(str));

       

        cout<<"length:"<<strlen(str)<<endl;

        for(i=0;i<=strlen(str);i++)

            if((str[i]>='a' && str[i]<='z')||(str[i]>='A' && str[i]<='Z'))

                countChar++;

      }

      cout <<"the amount of characters in data.txt is " <<countChar <<endl;

      cout <<"the amount of lines in data.txt is " <<countLine <<endl;

    }

}

2.

//product.h

class Product

{

private:

        char * name;

        int price;

        int quantity;

public:

        Product(char *a,int b,int c);

        bool purchase(int amount);

        void remain();

        ~Product();

};

//product.cpp

#include <iostream.h>

#include "Product.h"      

Product::Product(char *a,int b,int c)

{

        cout<<"Constructing Product..."<<endl;

        name=a;

        price=b;

        quantity=c;

        cout<<name<<","<<price<<","<<quantity<<endl;

}

bool Product::purchase(int amount)

{

        if(quantity<amount)

        {

                cout<<"no enough quantity!"<<endl;

                return false;

        }

        else

        {

                quantity-=amount;

                cout<<"payment :"<<amount*price<<endl;

                return true;

        }

}

void Product::remain()

{

        cout<<"The quantity of the remain products is: "<<quantity<<endl;

}

Product::~Product()

{

        cout<<"Destructing Product object!"<<endl;

}

//productApp.cpp

#include<iostream.h>

#include"Product.h"

void main()

{

        Product p("radio",80,100);

        int amount;

        cout<<"Please input the quantity :";

        cin>>amount;

        p.purchase(amount);

        p.remain();

}

面向对象程序设计》试题 一、单选题(每空2分,共40分) 1、关于C++与C语言关系的描述中,( )是错误的。 A.C语言C++语言的一个子集 B.C语言C++语言是兼容的 C.C++语言对C语言进行了一些改进 D.C++语言和C语言都是面向对象的 2、已知:int m=10; 下列表示引用的方法中,( )是正确的。 A.int& x=m; B.int& y=10; C.int& z; D.float& t=&m; 3、考虑下面的函数原型声明: void DefPar(int a, int b=7, char z = '*'); 下面函数调用中,不合法的是( )。 A.DefPar(5); B.DefPar(5,8); C.DefPar(5,'#'); D.DefPar(0,0,'*'); 4、系统在调用重载函数时往往根据一些条件确定哪个重载函数被调用,在下列选项中,不能作为依据的是( )。 A.函数的返回值类型 B.参数的类型 C.函数名称 D.参数个数 5、下列有关C++类的说法中,不正确的是( )。 A.类是一种用户自定义的数据类型 B.只有类中的成员函数或类的友元函数才能存取类中的私有成员 C.在类中,如果不做特别说明,所有成员的访问权限均为私有的 D.在类中,如果不做特别说明,所有成员的访问权限均为公用的 6、已知X类,则当程序执行到语句X array[3];时,调用了( )次构造函数。 A.0 B.1 C.2 D.3 7、有关析构函数的说法,不正确的是( )。 A.析构函数有且仅有一个 B.析构函数和构造函数一样可以有形参 C.析构函数的功能是在系统释放对象之前作一些内存清理工作 D.析构函数无任何函数类型 8、类定义的内容允许被其对象无限制地存取的是( )。 A.private 部分 B. protected 部分 C.public 部分 D.以上都不对 9、关于常数据成员的说法,不正确的是( )。 A.常数据成员的定义形式与一般常变量的,只不过常数据成员的定义必须出现在类体中 B.常数据成员必须进行初始化,并且不能被更新 C.常数据成员通过构造函数的成员初始化列表进行初始化 D.常数据成员可以在定义时直接初始化 10、运用运算符delete删除一个动态对象时( )。 A.系统首先为该动态对象调用构造函数,再释放其占用的内存 B.系统首先释放该动态对象占用的内存,再为其调用构造函数 C.系统首先为该动态对象调用析构函数,再释放其占用的内存 D.系统首先释放动态对象占用的内存,再为其调用析构函数 11、可在类外用p.a的形式访问派生类对象 p的基类成员a,其中a是( )。 A.私有继承的公用成员 B.公用继承的私有成员 C.公用继承的保护成员 D.公用继承的公用成员 12、在公用继承方式下,有关派生类对象和基类对象的关系,不正确的叙述是(  )。 A.派生类的对象可以赋给基类的对象 B.派生类的对象可以初始化基类的引用 C.派生类的对象可以直接访问基类中的成员 D.派生类的对象的地址可以赋给指向基类的指针 13、设置虚基类的目的是( )。 A.简化程序 B.消除二义性 C.提高运行效率 D.减少目标代码 14、在C++中,用于实现动态多态性的是( )。 A.内联函数 B.重载函数 C.模板函数 D.虚函数 15、不能说明为虚函数的是( )。 A.析构函数 B.构造函数 C.类的成员函数 D.以上都不对 16、如果一个类至少有一个纯虚函数,那么就称该类为( )。 A.抽象类 B.派生类 C.纯基类 D.以上都不对 17、下面关于友元的描述中,错误的是( )。 A.友元函数可以访问该类的私有数据成员 B.一个类的友元类中的成员函数都是这个类的友元函数 C.友元可以提高程序的运行效率 D.类与类之间的友元关系可以继承 18、下列运算符中,( )运算符在C++中不能被重载。 A.&& B.[ ] C.:: D.new 19、模板的使用实际上是将类模板实例化成一个( )。 A.函数 B.对象 C.类 D.抽象类 20、假定MyClass为一个类,则该类的拷贝构造函数的声明语句为( )。 A.MyClass(MyClass x) B.MyClass&(MyClass x) C.MyClass(MyClass &x) D.MyClass(MyClass *x) 二、填空题(前16个空,每空1分,后2个空,每空2分,共20分) 1、类和对象的关系可表述为:类是对象的 ,而对象则是类的 。 2、在C++中,三种继承方式的说明符号为 、 和 ,如果不加说明,则默认的继承方式为 。 3、如果只想保留公共基类的一个复制,就必须使用关键字 把这个公共基类声明为虚基类。 4、若要把void fun( )定义为类A的友元函数,则应在类A的定义中加入语句 。 5、类的静态成员分为 和 。 6、运算符重载要求保持其原来的操作数个数、 、 和语法结构。 7、通过关键字 可以声明模板,通过关键字 指定函数模板的类型参数,有几个类型参数就有几个类型关键字。 8、列出C++中两种用户自定义的数据类型: 、 。 9、构造函数的作用是 。 10、后置自增运算符“++”重载为类的成员函数(设类名为A)的形式为 。 三、阅读下面3个程序,写出程序运行时输出的结果:(共13分) 1、#include <iostream> using namespace std; void fun(int &a,int &b) { int p; p=a; a=b; b=p; } void exchange(int &a,int &b,int &c) { if(a<b) fun(a,b); if(a<c) fun(a,c); if(b<c) fun(b,c); } void main() { int a=12,b=89,c=56; exchange(a,b,c); cout<<"a="<<a<<",b="<<b<< ",c="<<c<<endl; } 2、#include <iostream> using namespace std; class Date { public: Date(int,int,int); Date(int,int); Date(int); Date(); void display(); private: int month, day, year; }; Date::Date(int m, int d, int y) : month(m),day(d),year(y) { } Date::Date(int m,int d):month(m),day(d) { year=2009; } Date::Date(int m) : month(m) { day=1; year=2010; } Date::Date() { month=1; day=1; year=2010; } void Date::display() { cout <<month<<"/"<<day<<"/"<<year<<endl; } void main() { Date d1(12,31,2009); Date d2(12,31); Date d3(1); Date d4; d1.display(); d2.display(); d3.display(); d4.display(); } 3、#include <iostream> using namespace std; class A { public: A() { cout<<"constructing A "<<endl; } ~A() { cout<<"destructing A "<<endl; } }; class B: public A { public: B() { cout<<"constructing B "<<endl; } ~B() { cout<<"destructing B "<<endl; } }; class C : public B { public: C() { cout<<"constructing C "<<endl; } ~C() { cout<<"destructing C "<<endl; } }; void main() { C c1; } 四、编程题(共27分) 1、(10分)已知复数类Complex的声明如下: class Complex { public: Complex(); Complex(double); Complex(double, double); friend Complex operator + (Complex&, Complex&); friend ostream & operator << (ostream&, Complex&); friend istream& operator >> (istream&, Complex&); private: double real, imag; }; 要求: (1)写出该类的所有构造函数的类外定义代码。 (2)写出对运算符“+”、“<<”、“>>”进行重载的运算符重载函数的定义。 2、(17分)下列Base类是一个表示形状的抽象类,area( )为求图形面积的函数,total( )则是一个通用的用以求不同形状的图形面积总和的函数。 class Base { public: virtual double area()=0; }; double total(Base *s[ ], int n) { double sum=0.0; for(int i=0; i<n; i++) sum+=s[i]->area( ); return sum; } 要求: (1)从Base类派生圆类(Circle)、正方形类(Square),圆类新增数据成员半径(radius),正方形类新增数据成员边长(a),圆类和正方形类都有构造函数,修改、显示数据成员值的函数,求面积函数。 (2)写出main( )函数,计算半径为5.5的圆和边长为9.9的正方形的面积和(必须通过调用total函数计算)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值