南开12春《面向对象程序设计》课程复习大纲与练习题

[复制链接]
发表于 2012-8-13 08:32:02 | 显示全部楼层 |阅读模式
《面向对象程序设计》课程复习大纲与练习题
课程名称 面向对象程序设计



息 名称 C++程序设计教程
出版社 南开大学出版社
作者 李敏,王刚,崔宝深编著
版次 2005
注:如学员使用其他版本教材,请参考相关知识点
第一章  初识C++
一、程序设计的基本概念:了解结构化程序设计和面向对象程序设计的思想。
二、高级程序设计语言C++:了解C++语言的发展历史和特点,掌握Microsoft Visual C++ 6.0继承开发环境的使用。
三、第一个C++程序:掌握C++程序的组成及各组成部分的作用。
四、C++与C的主要差异:掌握C++与C的主要差异。
第二章  类与对象
一、对象和类的概念:理解对象和类的概念及二者之间的关系。
二、类和对象的定义:掌握类定义方法、类中成员函数的定义方法、对象的定义方法、类成员的访问方法,理解访问限定符的作用。
三、构造函数和析构函数:理解构造函数、析构函数和拷贝构造函数的作用和调用时机,理解浅拷贝的问题和深拷贝的作用,掌握构造函数、析构函数和拷贝构造函数的定义方法。
四、静态成员:理解静态成员的作用,掌握静态成员的定义方法和访问方法,掌握静态数据成员的初始化方法,理解静态成员函数中不能访问非静态成员的原因。
五、友元:理解友元函数和友类的作用,掌握友元函数和友类的声明方法,理解类名声明的作用。
六、this指针:理解this指针的作用,掌握this指针的使用方法。
七、string类:理解string类的作用,掌握string类对象的初始化方法和常用操作方法。
第三章  继承
一、继承的概念:理解继承的概念和作用,了解继承与合成的区别。
二、单继承:掌握派生类的定义与访问方法,掌握派生类构造函数和析构函数的定义方法和调用时机,理解三种不同继承方式的作用。
三、类型兼容:理解类型兼容的作用,掌握类型兼容的三种应用情况。
四、多重继承:理解多重继承的作用,掌握多重继承的定义方法,理解多重继承中可能出现的二义性问题,掌握通过虚拟继承解决二义性问题的方法。
第四章  多态性与虚函数
一、多态性:理解多态性的含义,以及先期绑定和后期绑定的区别。
二、虚函数:理解虚函数的工作方式,掌握虚函数的声明方法,理解虚析构函数的作用,掌握虚函数的正确使用方法。
三、抽象类:理解抽象类的作用,掌握抽象类的定义方法。
第五章  运算符重载
一、运算符重载:理解运算符重载的作用,了解可以被重载的运算符,掌握运算符重载的定义形式和规则,掌握以类成员和非类成员实现运算符重载的两种方式。
二、友元重载:理解友元重载的作用,掌握友元重载的声明方法。
三、重载赋值运算符:掌握赋值运算符重载的实现方式。
四、重载操作符++和--:掌握前增量(或前减量)和后增量(或后减量)两种运算符的重载方式。
第六章  IO流
一、C++流概述:了解IO流类的结构和C++预定义的4个标准流对象的含义,掌握标准输出流对象和标准输入流对象的使用方法。
二、文件操作:理解文件中数据的组织方式和文件指针的含义,了解文件流类的结构,掌握文件操作方法。
三、“<<”和“>>”运算符重载:掌握“<<”和“>>”运算符重载的作用和使用方法。
第七章  模板
一、函数模板:理解函数模板的作用和工作方式,掌握函数模板的定义方式和使用方法。
二、类模板:理解类模板的作用和工作方式,掌握类模板的定义方式和使用方法。

期末综合练习题
一、读程序写结果
1、下面程序的运行结果为  0 1 2 3 4  。
#include <iostream>
using namespace std;
#define size 5
void get(int &n,int i)
{
n=i;
}
void print(int *n)
{
for(int i=0;i<size;i++)
  cout<<n<<" ";
}
int main()
{
int a[size];
for(int i=0;i<size;i++)
  get(a,i);
print(a);
return 0;
}
2、下面程序的运行结果为   1 2 3 4 5  
  1 9 3 4 5  。
#include <iostream>
using namespace std;
int nArray[] = {1, 2, 3, 4, 5};
int& Index(int nI)
{
return nArray[nI];
}
int main()
{
int nI;
for (nI = 0; nI < 5; nI++)
  cout<<nArray[nI]<<' ';
cout<<endl;
Index(1) = 9;
for (nI = 0; nI < 5; nI++)
  cout<<nArray[nI]<<' ';
return 0;
}
3、下面程序的运行结果为   x=0,y=0  
  x=2,y=3  。
#include <iostream>
using namespace std;
class Sample
{
    int x,y;
public:
  Sample(){x=y=0;}
  Sample(int a,int b){x=a;y=b;}
  void disp()
  {
   cout<<"x="<<x<<",y="<<y<<endl;
  }
};
int main()
{
  Sample s1, s2(2,3);
  s1.disp();
  s2.disp();
  return 0;
}
4、下面程序的运行结果为   Constructing account Tom   
  Constructing account Marry  
  Constructing account Jerry   
  Destructing account Tom   
  Destructing account Jerry   
  Destructing account Marry   。
#include<iostream>
#include<string.h>
using namespace std;
class Account {
public:
Account(char*, unsigned , double=0.0);
~Account();
private:
char *name;
unsigned acctNumber;
double balance;    };
Account::Account(char *pName,unsigned number, double bln)
{  
name = new char[strlen(pName)+1];
strcpy(name, pName);
acctNumber=number;
balance=bln;
cout<<"Constructing account "<<name<<endl; }
Account::~Account()
{
cout<<"Destructing account "<<name<<endl;
delete [] name; }
int main()
{
Account *pAcct=new Account("Tom",17);
Account Acct1("Marry",18,200), Acct2("Jerry", 19);
delete pAcct;
return 0;
}
5、下面程序的运行结果为   A=2,B=7  
  A=5,B=7  。
#include<iostream>
using namespace std;
class Sample
{
    int A;
    static int B;
public:
  Sample(int a){A=a,B+=a;}
  static void func(Sample s);
};
void Sample::func(Sample s)
{
    cout<<"A="<<s.A<<",B="<<B<<endl;
}
int Sample::B=0;
int main()
{
    Sample s1(2),s2(5);
    Sample::func(s1);
    Sample::func(s2);
  return 0;
}
6、下面程序的运行结果为   class Base     
  class Base     
  class Base     
  class Derived1  
  class Derived2  。
#include <iostream>
using namespace std;
class Base
{
public:
  void Who( ){cout<<"class Base"<<endl;}
};
class Derived1:public Base
{
public:
  void Who( ){cout<<"class Derived1"<<endl;}
};
class Derived2:public Base
{
public:
  void Who( ){cout<<"class Derived2"<<endl;}
};
int main( )
{
  Base obj1,*p;
  Derived1 obj2;
  Derived2 obj3;
  p=&obj1;
  p->Who();
  p=&obj2;
  p->Who();
  p=&obj3;
  p->Who();
  obj2.Who();
  obj3.Who();
  return 0;
}
7、下面程序的运行结果为   Shape      
  area:314   
  Shape      
  area:15     。
#include<iostream>
using namespace std;
class Shape
{
public:
  void Draw()
  {
   cout<<"Shape"<<endl;
  }
  virtual void Print()=0;
};
class Circle:public Shape
{
private:
  double r;
public:
  void Draw()
  {
   cout<<"Circle"<<endl;
  }
  void SetData(double radius)
  {
   r=radius;
  }
  void Print()
  {
   cout<<"area:"<<3.14*r*r<<endl;
  }
};
class Rectangle:public Shape
{
private:
  double a,b;
public:
  void Draw()
  {
   cout<<"Rectangle"<<endl;
  }
  void SetData(double x,double y)
  {
   a=x,b=y;
  }
  void Print()
  {
   cout<<"area:"<<a*b<<endl;
  }
};
int main()
{
  Circle c;
  Rectangle r;
  Shape *sp1=&c;
  Shape &sp2=r;
  c.SetData(10);
  r.SetData(3,5);
  sp1->Draw();
  c.Print();
  sp2.Draw();
  r.Print();
  return 0;
}
8、下面程序的运行结果为   A::A() called.  
  B::B() called.  
  B::~B() called.  
  A::~A() called.  。
#include<iostream>
using namespace std;
class A
{
public:
  A() {  cout<<"A::A() called.\n";  }
  virtual ~A() {  cout<<"A::~A() called.\n";  }                                 
};
class B:public A
{  
public:
  B(int i)
  {
   cout<<"B::B() called.\n";
   buffer=new char;
  }
  virtual ~B()
  {  
   delete []buffer;
   cout<<"B::~B() called.\n";
  }
private:
  char* buffer;  
};
void fun(A* a) {  delete a;  }
int main()
{  
  A *b=new B(10);
  fun(b);
  return 0;
}
9、下面程序的运行结果为   n=10  
  n=30  。
#include <iostream>
using namespace std;
class Sample;
Sample operator-(Sample &,Sample &);
Sample operator+(Sample &,Sample &);
class Sample
{
public:
Sample(){}
Sample(int i){n=i;}
friend Sample operator-(Sample &,Sample &);
friend Sample operator+(Sample &,Sample &);
void disp(){cout<<"n="<<n<<endl;}
private:
int n;
};
Sample operator-(Sample &s1,Sample &s2)
{
int m=s1.n-s2.n;
return Sample(m);
}
Sample operator+(Sample &s1,Sample &s2)
{
    int m=s1.n+s2.n;
return Sample(m);
}
int main( )
{
Sample s1(10),s2(20),s3;
s3=s2-s1;
s3.disp();
s3=s2+s1;
s3.disp();
return 0;
}
10、下面程序的运行结果为  空行            
  Index out of range.  
  Index out of range.  
  Nankai            
  Index out of range.U  
  Index out of range.U  
  6                  。
#include <iostream>
using namespace std;
class CArray
{
public:
CArray(int i)
{
  Length=i;
        Buffer=new char[Length+1];  
}
~CArray() {  delete []Buffer;  }
int GetLength() {  return Length;  }
char& operator[](int i);
private:
int Length;
char* Buffer;
};
char& CArray:perator[](int i)
{  
static char ch;
if(i<Length&&i>=0)
  return Buffer;
else
{  
  cout<<"\nIndex out of range.";
  return ch;
}
}
int main()
{
int cnt;
CArray string1(6);
char *string2="Nankai University";
for(cnt=0;cnt<8;cnt++)
  string1[cnt]=string2[cnt];
cout<<endl;
for(cnt=0;cnt<8;cnt++)
  cout<<string1[cnt];
cout<<"\n";
cout<<string1.GetLength()<<endl;
return 0;
}
11、下面程序的运行结果为   n=4  
  n=3  。
#include <iostream>
using namespace std;
class Sample
{
public:
Sample(int i){n=i;}
operator++(){n++;}   
operator++(int){n+=2;}   

void disp()
{
  cout<<"n="<<n<<endl;
}
private:
int n;
};
int main()
{
Sample A(2),B(2);
A++;   
++B;   
A.disp();
B.disp();
return 0;
}
12、下面程序的运行结果为   i+j=186  。
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ofstream file1;
file1.open("f1.dat");
file1<<123<<endl;
file1<<63.78;
file1.close();

ifstream file2("f1.dat");
int i, j;
file2>>i>>j;
cout<<"i+j="<<i+j<<endl;
file2.close();
return 0;
}
13、下面程序的运行结果为   fg      
  23456a  。
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
fstream file;
file.open("f1.dat", ios::in | ios:ut);
if(! file)
{
  cout<<"f1.dat can't open.\n";
  abort();
}
char str[]="abcdefg\n23456";
for(int i=0; i<sizeof(str); i++)
  file.put(str);
file.seekg(5);
char ch;
while(file.get(ch))
  cout<<ch;
cout<<endl;
file.close();
return 0;
}
14、下面程序的运行结果为    max函数被调用!  
  red               。
#include <iostream>
#include <string.h>
using namespace std;
template <class T> T max(T a, T b)  
{
cout<<"函数模板被使用!"<<endl;
return a>b ? a : b;
}
char *max(char *a, char *b)
{
cout<<"max函数被调用!"<<endl;
return strcmp(a,b)>0 ? a : b;
}
int main()
{   
    cout<<max("red", "green")<<endl;
return 0;
}
15、下面程序的运行结果为    s1=185  
  s2=36.5  。
#include <iostream>
using namespace std;
template <class T>
class add
{
T x, y;
public:
add(T a, T b)
{
  x=a;
  y=b;
}
T add1() { return x+y; }
};
int main()
{
add <int> A(65, 120);
add <double> B(13.6, 22.9);
cout<<"s1="<<A.add1()<<endl;
cout<<"s2="<<B.add1()<<endl;
return 0;
}
二、程序填空
1、swap()函数利用引用作为参数实现两个变量的交换,将程序填写完整。
#include <iostream>
using namespace std;
void swap(  int &x, int &y  )
{
int temp;
temp=x;
  x=y  ;
y=temp;
}
int main()
{
int a,b;
cin>>a>>b;
swap(  a, b  );
cout<<a<<" "<<b<<endl;
return 0;
}
2、下面的程序定义了两个类,一个是TennisClub,其成员数据有俱乐部和会员名,另一个是Person,其成员数据有姓名和年龄,类TennisClub的成员函数visit可以显示姓名、年龄、俱乐部名、会员名。将程序填写完整。
#include <iostream>
#include <string.h>
using namespace std;
   class Person  ;
class TennisClub
{
public:
TennisClub(char *p,char *q)
{
  strcpy(club,p);
  strcpy(name,q);
}
void visit(Person);
private:
char club[24];
char name[24];
};
class Person
{
public:
Person(char *p,int y)
{
  strcpy(name,p);
  age=y;
}
   friend void TennisClub::visit(Person x);  
private:
char name[24];
int age;
};
  void TennisClub::visit(Person x)  
{
cout<<"姓名:"<<x.name<<endl;
cout<<"年龄:"<<x.age<<endl;
cout<<"可以使用的俱乐部:"<<club<<endl;
cout<<"介绍人:"<<name<<endl;
}
int main()
{
TennisClub a("明星俱乐部","李晓明");
Person b("张静",28);
   a.visit(b);  
return 0;
}
3、请将下面程序补充完整。
#include <iostream>
using namespace std;
   class Student  ;     
class Teacher {
public:
void setScore(Student& s,double sc);
void setHour(Student& s,int h);
private:
long number;
char name[10]; };
class Student
{
public:
   friend class Teacher  ;
double getScore() { return score; }
int getHour() { return semeHour; }
private:
long number;
char name[10];
double score;
int semeHour;
};
void Teacher::setScore(Student& s,double sc) {
s.score=sc; } // 可以直接访问Student的私有数据成员
void Teacher::setHour(Student& s,int h) {
s.semeHour=h; } // 可以直接访问Student的私有数据成员
int main() {
Teacher t;
Student s;
t.setScore(s,98.5);
t.setHour(s,5);
cout<<s.getScore()<<"   "<<s.getHour()<<endl;
return 0; }
4、请补充完整下面类说明中的拷贝构造函数。
class MyClass
{
public:
int *p;
int size;
MyClass(int n):size(n),p(new int[n]){}
~MyClass(){delete []p;}
MyClass(MyClass& mc): size(  mc.size  )
{
  p = new int[size]  ;
  for(int i=0;i<size;i++)
     p = mc.p;  
}
};
5、将下列程序填写完整。
#include <iostream>
using namespace std;
class Point
{
public:
Point(double a,double b,double c){   X=a;Y=b;Z=c;   }
double Getx(){return X;}
double Gety(){return Y;}
double Getz(){return Z;}
private:
   double X,Y  ;
protected:
   double Z  ;
};
  class Line : public Point  
{
public:
Line(double a ,double b,double c,double d)  oint(a,b,c)  {  K=d;  }
void show()
{
  cout<<Getx()<<endl;
  cout<<Gety()<<endl;
  cout<<Getz()<<" "<<Z<<endl;
  cout<<K<<endl;
}
private:
double K;
};
int main( )
{
Line obj(1.2,3.4,5.6,7.8);
obj.show();
return 0;
}
6、将下列程序填写完整。
#include <iostream>
using namespace std;
class Furniture
{
public:
void SetWeight(int i){ m_weight =i; }
int GetWeight(){ return m_weight; }
void Move(int i){ cout<<"Move "<<i<<"m."<<endl; }
protected:
int m_weight;
};
class Bed :  virtual public Furniture  
{
public:
void Sleep(){ cout <<"Sleeping...\n"; }
};
class Sofa :  virtual public Furniture  
{
public:
void WatchTV(){ cout <<"Watching TV.\n"; }
};
class SofaBed :  public Bed, public Sofa  
{
public:
void FoldOut(){ cout <<"Fold out the sofa.\n"; }
};
int main()
{
SofaBed ss;
ss.SetWeight(20);
cout <<ss.GetWeight() <<endl;
ss.Move(1);
return 0;
}
7、下面的程序将一个普通函数作为类的友元函数,求坐标点之和,并且程序输出结果为2,2,4,请将程序补充完整。
#include <iostream>
using namespace std;
class Point
{   
int X,Y;
public:
   Point(int x=0, int y=0)  
{  X=x; Y=y; Countp++;  }
Point(Point &p)
{  X=p.X; Y=p.Y; Countp++; }
~Point()
{ Countp--;  }
   friend Point myfun(Point p1, Point p2, Point p3)  ;
static int Countp;
void display(){cout<<X<<","<<Y<<",";}
};
Point myfun(Point p1, Point p2, Point p3)
{
Point tmp(p1.X+p2.X+p3.X, p1.Y+p2.Y+p3.Y);
   return tmp;  
}
  int Point::Countp = 0;  
int main()
{
Point pp0,pp1(1,2),pp2(1);
Point p=myfun(pp0,pp1,pp2);
p.display ();
cout<<  p.Countp或Point::Countp  <<endl;     // 输出Countp的值
return 0;
}
8、ARRAY类的定义如下,构造函数把参数n的值赋给s,给v动态分配长度为n的数组空间,然后利用数组参数a初始化v所指向的数组。请将类定义补充完整。
class ARRAY
{   
int *v;
int s;
public:
ARRAY( int a[], int n );
~ARRAY( )
{  delete []v;  }                                 
int size()
{  return s;  }
int& operator[](int n);
};
  ARRAY::  ARRAY(int a[], int n)      
{  
if( n<=0 )
{  v=NULL; s=0; return;  }
s=n;
v=  new int  ;
for(int i=0; i<n; i++)
    v=a  ;
}
9、下面程序的功能是将文本文件readme.txt中的内容读出并显示在屏幕上,请将程序补充完整。
#include <iostream>
#include <fstream>
#include <stdlib.h>
using namespace std;
int main()
{
char str[80];
ifstream me("readme.txt");
if (  !me  )
{
  cout<<"文件打开失败!"<<endl;
  abort();
}
while (  !me.eof()  )
{
  me.  getline  (str, 80);
  cout<<  str  <<endl;
}
me.close();
return 0;
}
10、下面程序的功能是:在文件f7.txt的尾部写入一个字符串,请将程序补充完整。
#include <fstream>
#include <string.h>
using namespace std;
int main()
{
char ch[]="The end";
ofstream outstr("f7.txt",   ios::app  );  
for(int i=0; i<strlen(ch); i++)
  outstr.  put(ch)  ;
outstr.close();
return 0;
}
11、下面程序的功能是:统计文件f7.txt中的字符个数,请将程序补充完整。
#include <iostream>
#include <fstream>
#include <stdlib.h>
using namespace std;
int main()
{
fstream file;
file.open("f7.txt",   ios::in  );
if(!file)
{
  cout<<"Can not open f7.txt"<<endl;
  abort();
}
char ch;
int i=0;
while (!file.eof())
{
  file.get(  ch  );  
  i++;
}
cout<<"Characters: "<<i<<endl;
file.close();
return 0;
}
12、下面的程序将一个已有文件的内容复制到另一个文件中。请将程序补充完整。
#include<iostream>
#include<fstream>
#include<stdlib.h>
using namespace std;
int main()
{
   fstream infile, outfile  ;
infile.open("c:\\file1.txt",ios::in);
if (!infile)
{
  cout<<"file1.txt can't open.\n";
  abort();
}
outfile.open("c:\\file2.txt",ios:ut);
if(!outfile)
{
  cout<<"file2.txt can't open.\n";
  abort();
    }
char str[80]="\0";
while(!infile.eof())
{  
  infile.read(str,sizeof(str));
    outfile.write(str, sizeof(str))  ;
  cout<<str;
}
cout<<endl;
infile.close();
   outfile.close()  ;
return 0;
}
13、下面的程序是一个类模板,可实现求三个变量的和,请将程序补充完整。
#include <iostream>
using namespace std;
  template <class Type>  
class ff
{
Type a1, a2, a3;
public:
   ff(Type b1, Type b2, Type b3)  
{  a1=b1; a2=b2; a3=b3;  }
   Type sum()  
{  return a1+a2+a3;  }
};
int main()
{
ff <int> x(12,13,14), y(16,17,18);
cout<<x.sum()<<"  "<<y.sum()<<endl;
return 0;
}
三、单项选择题
1、结构化程序设计方法以(  B  )为中心进行分析和设计。
A、结构   B、模块   C、对象   D、类
2、面向对象程序设计方法以(  C  )为中心进行分析和设计。
A、结构   B、模块   C、对象   D、类
3、“#include <iostream>”是(  B  )预处理命令。
A、宏定义  B、文件包含  C、条件编译  D、工程配置
4、下列关于主函数的叙述中正确的是(  B  )。
A、一个程序可以有多个主函数
B、程序从主函数开始执行
C、一个程序可以没有主函数
D、主函数是一个特殊的函数,因此其结构与其他函数不同
5、在一个C++源文件中使用了cin和cout,那么在这个源文件中必须包含(  A  )文件。
A、iostream  B、fstream  C、stdio.h  D、stdlib.h
6、已知函数原型:void f(int a, int b=3,char c='*'); 则下面的函数调用中,不合法的调用是(  C  )。
A、f(5)   B、f(5,8)   C、f(6, , '#')  D、f(0,0, '#')
7、程序在调用重载函数时,根据(  C  )区分到底要调用哪个函数。
A、函数名      B、返回值类型
C、参数个数和类型    D、以上都可以
8、变量的引用,其含义是指该变量的(  C  )。
A、值   B、类型   C、别名   D、地址
9、已知“float *p; p=new float[2];”,若要释放p所指向的堆中的这些字节,下列语句正确的是(  C  )。
A、delete p;  B、delete p[];  C、delete []p;  D、delete p[2];
10、已知“int a=10,b=8;int &r=a; r=b;cout<<a<<","<<b<<","<<r;”,则输出为(  D  )。
A、10,8,10  B、10,8,8  C、8,8,10  D、8,8,8
11、假设堆内存分配均成功,则下面程序段完全正确的是(  A  )。
A、int *p=new int(3);cout<<*p;delete p;
B、int *p=new int[5]={1,2,3,4,5};for(int i=0;i<5;i++)cout<<p;delete []p;
C、int *p=new int[5];for(int i=0;i<5;i++,p++) {*p=i; cout<<*p;}delete []p;
D、以上程序段均正确
12、有关带默认参数的函数的描述正确的是(  D  )。
A、只能在函数定义时设置默认参数值
B、只能在函数声明时设置默认参数值
C、函数调用时,必须使用默认的参数值,不能给出新的实参值
D、设置默认参数时,应该设置最右边的若干个参数的默认值
13、有关重载函数的描述正确的是(  C  )。
A、函数名相同的函数就是重载函数
B、函数名相同但返回值类型不同的函数就是重载函数
C、函数名相同但参数个数或类型不同的函数就是重载函数
D、函数功能相同的函数就是重载函数
14、以下为重载函数的一组函数声明的是(  A  )。
A、void print(int);  void print(double);
B、void fun(int);   int fun(int);
C、int max(int,int);  int min(int,int);
D、void mm();     int mm();
15、已知“int a=10;int &r=a; r=r+20;cout<<a;”,则输出为(  C  )。
A、10   B、20   C、30   D、不确定值
16、已知“int a=10,*p;int *&r=p; r=&a;*r=20;cout<<a;”,则输出为(  B  )。
A、10   B、20   C、不确定值  D、程序有错误
17、下列关于类和对象的叙述中,错误的是(  A  )。
A、一个类只能有一个对象   B、对象是类的具体实例
C、类是某一类对象的抽象   D、类和对象的关系是一种数据类型与变量的关系
18、有如下类声明:
class Sample { int x; };
则Sample类成员x是Sample类的(  C  )。
A、公有数据成员     B、保护数据成员
C、私有数据成员     D、以上选项都不正确
19、下列关于成员函数特征的描述中,错误的是(  B  )。
A、成员函数可以重载
B、成员函数一定是内联函数
C、成员函数可以设置参数的默认值
D、成员函数可以是静态的
20、类的默认的无参构造函数(  D  )。
A、在任何情况下都存在
B、仅当未定义无参构造函数时存在
C、仅当未定义有参构造函数时存在
D、仅当未定义任何构造函数时存在
21、C++中,关于构造函数和析构函数,正确的描述是(  C  )。
A、在定义类时,必须自定义构造函数和析构函数,在创建对象时自动调用构造函数,在释放对象时自动调用析构函数
B、构造函数和析构函数均可以重载
C、已知类Student以及Student *p; 在使用p=new Student;时自动调用无参构造函数创建动态对象,在delelte p;时自动调用析构函数释放动态对象
D、构造函数和析构函数都可以成为虚函数
22、通常的拷贝构造函数的参数是(  C  )。
A、某个对象名     B、某个对象的成员名
C、某个对象的引用名    D、某个对象的指针名
23、任意一个类,析构函数的个数最多是(  B  )。
A、不限个数  B、1   C、2   D、3
24、对于拷贝构造函数,正确的描述是(  A  )。
A、在C++语言中,如果不自定义类的拷贝构造函数,则每个类都有默认的拷贝构造函数
B、必须为每个类定义拷贝构造函数
C、如果要使用拷贝构造函数,则必须在类中先定义
D、当定义了类的构造函数时,如果要使用拷贝构造函数,则必须定义拷贝构造函数
25、在类的定义中,用于为对象分配内存空间,对类的数据成员进行初始化并执行其他内部管理操作的函数是(  C  )。
A、友元函数  B、虚函数  C、构造函数  D、析构函数
26、静态数据成员初始化在(  B  )进行,而且前面不加static,以免与一般静态变量或对象相混淆。
A、类体内  B、类体外  C、构造函数内 D、内联函数内
27、有关静态成员的描述错误的是(  D  )。
A、某个类的静态数据成员由该类的所有对象所共享
B、类的公有静态数据成员既可以用类的对象访问,也可以直接用作用域运算符“::”通过类名来访问
C、静态数据成员既可以是私有成员,也可以是公有成员
D、类中一旦定义了静态数据成员,就必须定义静态成员函数,以便对静态数据成员进行操作
28、如果类A被说明成类B的友元,则(  B  )。
A、类A的成员函数不得访问类B的所有成员
B、类A的成员函数可以访问类B的所有成员
C、类A的成员即类B的成员
D、类B的成员即类A的成员
29、下列关于this指针的说法,正确的是(  D  )。
A、this指针一定指向常量型数据
B、this指向的数据不可更改
C、静态成员函数中也可以访问this指针
D、this指针本身可直接作为成员函数的返回值
30、使用string类,必须在程序中包含头文件(  B  )。
A、string.h  B、string   C、cstring.h  D、cstring
31、在一个string类对象表示的字符串中插入新字符,应该使用string类的(  B  )函数。
A、assign  B、insert   C、swap   D、find
32、将一个string类对象赋予新值,应该使用string类的(  A  )函数。
A、assign  B、insert   C、swap   D、find
33、在C++中,通过(  A  )的机制可以扩充和完善旧的程序设计以适应新的需要。
A、继承   B、封装   C、多态   D、重载
34、下列关于继承的描述中,错误的是(  D  )。
A、析构函数不能被重载
B、派生类是基类的组合
C、派生类的成员除了它自己的成员外,还包括了它的基类成员
D、派生类中基类成员的访问权限到派生类保持不变
35、派生类中的成员不能访问基类中的(  A  )。
A、私有成员  B、公有成员  C、保护成员  D、以上都可以
36、下面描述中,错误的是(  B  )。
A、公有继承时,基类中的public成员在派生类中仍是public的
B、公有继承时,基类中的private成员在派生类中仍是private的
C、公有继承时,基类中的protected成员在派生类中仍是protected的
D、私有继承时,基类中的public成员在派生类中是private的
37、派生类的构造函数的成员初始化列表中,不能包含(  C  )。
A、基类的构造函数    B、派生类中子对象的初始化
C、基类的子对象初始化   D、派生类中一般数据成员的初始化
38、基类的(  B  )在私有继承时在派生类中为私有成员函数,在公有和保护继承时在派生类中为保护成员函数。
A、私有成员函数     B、保护成员函数
C、公有成员      D、保护数据成员
39、多继承的构造函数顺序可分为如下4步:
①所有非虚基类的构造函数按照它们被继承的顺序构造。
②所有虚基类的构造函数按照它们被继承的顺序构造。
③所有子对象的构造函数按照它们声明的顺序构造。
④派生类自己的构造函数体
这四个步骤的正确顺序是(  C  )。
A、④③①②  B、②④③①  C、②①③④  D、③④①②
40、下列关于虚函数的说明中,正确的是(  B  )。
A、从虚基类继承的函数都是虚函数
B、虚函数不得是静态成员函数
C、只能通过指针或引用调用虚函数
D、抽象类中的成员函数都是虚函数
41、虚函数必须是类的(  B  )。
A、友元函数  B、成员函数  C、构造函数  D、析构函数
42、对于虚析构函数与一般虚函数,以下说法正确的是(  C  )。
A、重定义函数就是派生类的构造函数
B、重定义函数就是派生类的析构函数,要求同名
C、一个虚析构函数的版本被调用执行后,接着就要执行其基类版本
D、基类和派生类都分别给出了一个虚函数的不同版本
43、类型兼容是指在基类对象可以出现的地方,都可以使用公有派生类的对象,已知:
   class BaseClass
   {  //…};
   class DerivedClass:public BaseClass
   {  //…};
   BaseClass b,*pb;
   DerivedClass d,*pd;
下面不属于类型兼容的是(  C  )。
A、b=d;       B、BaseClass &bb=d;
C、pd=&b;      D、pb=&d;
44、抽象类的作用主要是(  D  )。
A、直接用作基类     B、直接用作指针
C、引用的基类型     D、包括以上各项
45、抽象类不能定义对象,但可以声明抽象类的(  D  )。
A、指针或引用     B、函数返回类型
C、显式转换      D、以上都是
46、在一个类中,可以对一个操作符进行(  D  )重载。
A、1种   B、2种   C、3种   D、多种
47、下列运算符中,(  A  )在C++中不能重载。
A、?:   B、+   C、-   D、<=
48、在表达式x+y*z中,+ 是作为成员函数重载的运算符,*是作为非成员函数重载的运算符。下列叙述中正确的是(  C  )。
A、operator+有两个参数,operator*有两个参数
B、operator+有两个参数,operator*有一个参数
C、operator+有一个参数,operator*有两个参数
D、operator+有一个参数,operator*有一个参数
49、友元重载运算符obj1>obj2被C++编译器解释为(  A  )。
A、operator>(obj1,obj2)   B、>(obj1,obj2)
C、obj1.operator>(obj2)   D、obj2.operator>(obj1)
50、下列运算符中,必须使用成员函数进行重载的是(  B  )。
A、==   B、=   C、>>   D、++
51、下列关于运算符重载的描述中,错误的是(  D  )。
A 、运算符重载不可以改变优先级
B、运算符重载不可以改变结合性
C、运算符重载不可以改变运算符的操作数个数
D、加法运算符“+”和赋值运算符“=”都重载之后,意味着“+=”也被重载了
52、有关运算符重载的说法错误的是(  C  )。
A、在一个类中,可以对一个操作符进行多次重载
B、重载赋值运算符“=”时,为了保持原有特性,重载运算符函数中应该使用返回语句“return *this;”
C、C++中所有的运算符都可以被重载
D、如果在某个类中使用成员函数对运算符重载,其左操作数必须是该类的对象
53、已知某个类的友元函数重载了+=和-,a,b,c是该类的对象,则“a+=b-c”被C++编译器解释为(  A  )。
A、operator+=(a,operator-(b,c))  B、a.operator+=(b.operator-(c))
C、operator+=(a,b.operator-(c))  D、a.operator+=(operator-(b,c))
54、cout是I/O流库预定义的(  B  )。
A、类   B、对象   C、常量   D、包含文件
55、4个预定义流对象为带缓冲的标准出错信息输出的是(  D  )。
A、cin   B、cout   C、cerr   D、clog
56、下面4个选项中,表示读取单个字符的是(  B  )。
A、cin   B、cin.get()  C、cin.put()  D、cin.getline()
57、cin是(  A  )类的一个对象,用来处理标准输入,即键盘输入。
A、istream  B、ostream  C、fstream  D、iostream
58、在C++中,打开一个文件,就是将该文件与(  B  )建立关联;关闭一个文件,就是取消这种关联。
A、类   B、流对象  C、对象   D、结构
59、C++程序进行文件操作时,需要包含头文件(  B  )。
A、iostream  B、fstream  C、stdio.h  D、stdlib.h
60、下列关于read( )函数的叙述中,正确的是(  D  )。
A、read( )函数只能从键盘输入中获取字符串
B、read( )函数所获取的字符多少是不受限制的
C、read( )函数只能用于对文本文件的操作
D、read( )函数只能按规定读取所指定的字符数
61、下列关于getline( )函数的叙述中,错误的是(  D  )。
A、getline( )函数可以用于从键盘上读取字符串
B、getline( )函数读取字符串长度是受限制的
C、getline( )函数读取字符串时,遇到终止符就停止
D、getline( )函数中所使用的终止符只能是换行符
62、以下叙述中,错误的是(  D  )。
A、C++语言中的文本文件以ASCII 码形式存储数据
B、C++语言中对二进制文件的访问速度比文本文件快
C、用open( )函数打开的文件,使用完毕后,必须用close()函数关闭
D、C++语言中,随机读/写方式不适用于文本文件
63、以下选项中,错误的是(  C  )。
A、fstream iofile;  iofile.open("abc.txt", ios::in);
B、ofstream ofile;  ofile.open("C:\\vc\\abc.txt", ios::binary);
C、cout.open("C:\\vc\\abc.txt", ios::binary);
D、ifstream ifile("C:\\vc\\abc.txt");
64、(  C  )使一个函数可以定义成对不同数据类型完成相同操作。
A、重载函数   B、模板函数  C、函数模板  D、递归函数
65、函数模板的执行代码是在(  D  )时生成的。
A、执行函数       B、源程序中声明函数
C、源程序中定义函数     D、源程序中调用函数
66、下面函数模板的定义中,有(  B  )处错误。
template <class T1, T2>
T2 f1(T1 a, T1 b)
{
     return (a>b) ? (a) : (b);
}
A、1    B、2   C、3   D、4
67、一个(  C  )允许用户为类定义一种模式,使得类中的某些数据成员及某些成员函数的返回值能取任意类型。
A、函数模板   B、模板函数  C、类模板  D、模板类
68、类模板的模板参数(  D  )。
A、只可作为数据成员的类型   B、只可作为成员的返回类型
C、只可作为成员函数的参数类型  D、以上3项均可以
四、判断题
1、在C++程序中,主函数的函数名必须是main。 (√)
2、类中所提供的成员函数可以直接访问该类的私有成员。 (√)
3、类定义中的成员默认的访问权限是private。 (√)
4、一个类中的保护成员和公有成员类似,在程序的任何地方都可以被访问。 (×)
5、系统提供的缺省构造函数没有参数,所以自定义构造函数必须带有参数。 (×)
6、一旦自定义了构造函数,系统便不再提供缺省的构造函数。 (√)
7、一个类只能有一个构造函数和一个析构函数。 (×)
8、静态数据成员必须在类中进行定义和初始化。 (×)
9、静态成员函数中不能访问非静态成员。  (√)
10、在一个类中声明了某个静态数据成员,并在类外给出其定义和初始化后,若未定义该类的对象,该静态数据成员则不存在。 (×)
11、派生类至少有一个基类。  (√)
12、在C++中,允许从一个类派生出任意多个类,但不允许某个类同时从多个类派生。(×)
13、对虚函数的调用,系统都是采用动态联编。 (×)
14、抽象类虽然也是一种数据类型,但它不能建立对象,只能作为基类被其他类继承。(√)
15、重载插入运算符“<<”必须采用成员重载。 (×)
16、如果类A是类B的友类,那么类A中的所有成员函数都可以访问类B中的所有成员。 (√)
17、释放派生类的对象时,首先调用基类的析构函数,然后调用派生类的析构函数。 (×)
18、拥有纯虚函数的类称为虚拟基类,它不能用来定义对象。 (√)
19、虚函数只有在有继承的情况时才会存在。 (√)
20、已知:class Base1{//…};
          class Base2{//…};
          class Derived:public Base1, public Base2
          {   Derived():Base2(),Base1(){}
              //…
          };
创建Derived类的对象时,先调用Base2的构造函数,然后调用Base1的构造函数,最后调用Derived的构造函数。 (×)
21、基类的指针或引用调用虚函数时采用后期绑定。 (√)
22、由抽象基类继承得到的派生类肯定是具体类。 (×)
23、友元函数内能够访问任何对象的任何成员。 (×)
24、对二元运算符采用成员函数重载时,只需要一个参数,而且该参数可以是内部类型。 (√)
25、对一元运算符采用某个类的友元函数重载时需要一个参数,参数为该类的对象,不能是其他类型。 (√)
26、C++的输入/输出流库中,ios类是一个虚基类,istream类、ostream类以及streambuf类都是ios类的派生类。 (×)
27、设inf是一个ifstream类的流对象,则inf.seekg(10,ios::beg);表示将文件指针从文件当前位置向后移动10个字节。 (×)
五、填空题
1、C++源程序文件的扩展名为  cpp  。
2、已知定义函数:void f (char ch='*'){cout<<ch;}
   在主函数中有调用语句“f ('# ');”,则输出为  #  。
3、  构造函数  是个特殊成员函数,用于初始化类的数据成员。
4、在C++语言中,每个类都有一个隐含的指针,叫做  this  指针。该指针指向  正在操作的对象  。
5、有如下定义语句:MyClass *p;,则执行p=new MyClass;语句时,将自动调用该类的  构造函数  。执行delete p;语句时,将自动调用该类的  析构函数  。
6、  继承方式  用于控制基类中声明的成员在多大的范围内能被派生类的用户访问。
7、派生类除了从基类继承所有成员之外,通常还增加了新的   数据成员   和   成员函数   。
8、派生类从基类  公有继承  时,基类的公有成员和保护成员在派生类中仍然是公有成员和保护成员。
9、对基类成员的初始化必须在派生类  构造  函数的成员初始化列表中调用基类构造函数完成。
10、继承方式有三种:   公有继承   、   保护继承   和   私有继承   。
11、拥有纯虚函数的类称为  抽象类  ,它不能用来定义对象。
12、在派生类中可以重新定义从基类继承下来的虚函数。重定义时,通常要保持   函数名   、   形参列表   和   返回类型   不变。
13、在成员函数专用名的前面加上  virtual  修饰,即把该函数声明为虚函数。
14、抽象类区别于其他类的最根本特征是  包含纯虚函数、不能实例化对象  。
15、虚函数不得声明为  静态函数  。
16、抽象类中的纯虚函数的实现由  派生类  给出。
17、重载运算符函数的函数名由关键字  operator  引出。
18、运算符的重载归根结底是  函数  的重载。
19、后缀自增自减运算符定义时带有  整型形参  。
20、重载的运算符的参数不能全部是  内部类型  。
21、 编译程序选择重载的运算符是遵循  函数重载  的原则
22、编译程序选择重载的运算符按照  形参个数  或  形参类型  来选择不同的重载运算符。
23、cin是  istream类  的一个对象,处理标准输入;cout、cerr和clog是  ostream类  的对象,cout处理标准输出,cerr和clog处理标准出错信息。
24、文件流可分为3类:输入流、输出流和  输入输出流  ,相应地必须将流说明为ifstream、ofstream及fstream类的对象。
25、如果一个函数模板定义有多个类型参数,则每个类型形参之间必须用逗号隔开,并且每个类型形参都必须使用关键字  class  进行说明。
26、已知int fun(int a) {return a*a;}和float fun(float a) {return a*a;}是一个函数模板的两个实例,则该函数模板的定义为  template <class T> T fun(T a) {return a*a;}  。
27、使用函数模板的方法是先定义函数模板,然后实例化成相应的  模板函数  进行调用执行。
转载请注明奥鹏作业答案www.ap5u.com
快速回复 返回顶部 返回列表