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();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值