一  选择题
  1. 对类的构造函数和析构函数描述正确的是__[1]___ A<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

    A)构造函数可以重载,析构函数不能重载
    B)构造函数不能重载,析构函数可以重载
    C)构造函数可以重载,析构函数也可以重载
    D)构造函数不能重载,析构函数也不能重载
  2.  类的析构函数的作用是___[2]___D
A)一般成员函数    B)类的初始化  C)对象的初始化    D)释放对象
类的析构函数是在类对象被释放的时候自动调用的,它的作用是释放一个对象。在对象删除前,用它来做一些清理工作。

  3. 假定MyClass为一个类,则该类的拷贝初始化构造函数的声明语句为___[3]___ C
    A)MyClass&(MyClass  x)    B)MyClass(MyClass  x)
C)MyClass(MyClass& x)     D)MyClass(MyClass  *x)
注意:它的形参是一个引用。

  4.假定MyClass为一个类,则执行MyClass a,b(2),*p;语句时,自动调用该类构造函数_[4]次。A    
A)2       B)<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />3      C)4      D)5 
定义指针p并不调用类的构造函数。
下面对于友元函数描述正确的是__[5]___C
    A)友元函数的实现必须在类的内部定义
    B)友元函数是类的成员函数
    C)友元函数破坏了类的封装性和隐藏性
D)友元函数不能访问类的私有成员
友元函数虽然在类的定义中声明,但它不是类的成员函数。

C++中,数据封装要解决的问题是___[6]___D
    A)数据的规范化    B)便于数据转换
    C)避免数据丢失    D)防止不同模块之间数据的非法访问
一个类的友元函数或友元类能够通过成员操作符访问该类的____[7]____
A)私有成员    B)保护成员    C)公用成员    D)所有成员
类的友元函数对类的属性和方法的访问能力等同与类的成员函数。

为了使类中的某个成员不能被类的对象通过成员操作符访问,则不能把该成员的访问
    权限定义为___[9]____A
    A)public    B)protected    C)private    D)static
10  下面对静态数据成员的描述中,正确的是___[10]___D
    A)静态数据成员可以在类体内进行初始化
    B)静态数据成员不可以被类的对象调用
    C)静态数据成员不能受private控制符的作用
D)静态数据成员可以直接用类名调用
静态数据成员应该在类体外进行初始化,其初始化与它的访问控制权无关,其访问则受到访问控制权的限制。静态数据成员是所有类对象共享的成员,即可通过类名访问,又可通过对象访问。通过类名访问更方便,更高效

11  下面对静态数据成员的描述中,正确的是__[11]___A

    A)静态数据成员是类的所有对象共享的数据
    B)类的每个对象都有自己的静态数据成员
    C)类的不同对象有不同的静态数据成员值
    D)静态数据成员不能通过类的对象调用
12  对于下面定义的类MyClass,在函数f()中将对象成员n的值修改为50的语句应该
___[12]___C

class MyClass
{
public:
            MyClass(int x) { n = x;}
            void SetNum(int nl){ n =nl; }
private:
            int n;
}
int f( )
{
        MyClass  *ptr = new MyClass(45);
        _____________
}

 

A) MyClass(50)   B) SetNum(50)   C) ptr->SetNum(50)   D) ptr->n = 50
private数据成员不允许被非成员函数直接调用,所以D)错

13      下面是类MyClass的定义,对定义中语句描述正确的是___[13]___D

class MyClass
{
public:
            void MyClass(int a) { X = a; }             //不能有类型void

            int f(int a, int b)                       //
            {
                X=a;
                Y=b;
            }
            int f(int a, int b, int c = O)               //不能实现函数重载

            {                                            // 调用f(10,20)时产生二义

                X=a;
                Y=b;
                Z=c;
            }
            static void g() { X=10; }     //静态成员函数不能操作类的非静态成员
private:
            int X, Y, Z;
};

 

A)语句①是类MyClass的构造函数定义
B)语句②和语句③实现类成员函数的重载
C)语句④实现对类成员变量X的更新操作
D)语句①和④都不正确, ②和③有二义。
二、 填空题
15  C语言中,编程的单位是__函数___;C++语言中,编程的单位是______
16  类是对具有共同属性和行为的一类事物的抽象描述,共同属性被描述为类中的
   __数据成员___,共同行为被描述为类中的__成员函数___
17  类的具体表现是通过定义__对象_____来操作的。
18  对类中的成员函数和属性的访问是通过__private__protected___public__3
    个关键字来控制的。
19  一般情况下,按照面向对象的要求,把类中的数据成员(属性)定义为__private ___
    限,而把成员函数(方法)定义为__public ____权限。   

20)  在类定义中,数据和成员函数默认权限是private _________
21  类中构造函数有__一个或多个___个,析构函数有__一个_个。
22  类中的构造函数是一个特殊的成员函数,它由类的对象__自动___调用,它的作用
    是②为对象分配内存空间,为类的数据成员进行初始化并进行一些其它类的内部操作
23  在定义类的对象时,C++程序将自动调用该对象的_构造_____函数初始化对象自身。
24  在撤销类的对象时,C++程序将自动调用该对象的__析构____函数。
25 __new___运算符对指定类型对象动态分配内存并返回____指向该类型对象的指针____
26 __delete______运算符删除(25)题中的运算符所动态分配的内存空间。
27  假定用户没有给一个名为MyClass的类定义构造函数,则系统为其定义的默认构造
    函数形式为MyClass(){  }______
28  假定用户没有给一个名为MyClass的类定义析构函数,则系统为其定义的默认析构
    函数形式为~MyClass() { }______
29  在类中定义和实现的函数称为_内联函数_______
30  非成员函数应声明为类的__友元______才能访问这个类的private成员。
31  若要把类FriendClass定义为类MyClass的友元类,则应在类MyClass的定义中加入
    语句_ friend class FriendClass _______
32  若要把函数void FriendFunction()定义为类MyClass的友元函数,则应在类MyClass   
    的定义中加入语句_ friend void FriendFunction( ) ______
33       下面的类中定义了一个关于星期的枚举类型,请完成下面的程序。
        class MyClass
{
public:
    enum Week {Sun,Mon,Tue,Wed,Thur,Fri,Sat };//枚举常量的值分别为:01

    Week week;
        }
void fun(MyClass &my)
{
            ___my.week ____= __Wed ____; //将对象myweek赋值为所定义的枚举类型
                                 //值为3的枚举量
       }
34  在下面程序的横线处填上适当的语句,使该程序执行结果为10
#include <iostream.h>
class MyClass
{
public:
            ___MyClass(int a){ x=a; }____         //x置值
            ___int GetNum( ){ return x; }____         //x
private:
            int x;
};
void main()
{
        MyClass my(10);
cout << my.GetNum() << endl;
}

 

35  完成下面的类定义。
class MyClass
{
public:
            MyClass( ) { x = 0; }
            ___friend ___ int GetNum(__MyClass ____ my);
private:
            int x;
};
int GetNum(__MyClass ____  my)
{
        return my.x;
}
三、编写程序:
1.     定义一个Point类来处理三维点points(x,y,z).该类有一constructor,copy constructor, negate()成员函数将pointx,yz值各乘-1, norm()成员函数返回该点到原点(000)的距离,一个print()成员函数显示x,y,z的值。
#include <math.h>
#include <iostream.h>
class Point
{ public:
    Point(float x=0, float y=0, float z=0): x_(x), y_(y), z_(z) { }
    Point(const Point& p) : x_(p.x_), y_(p.y_), z_(p.z_) { }
    void negate() { x_ *= -1; y_ *= -1; z_ *= -1; }
    double norm() { return sqrt(x_*x_ + y_*y_ + z_*z_); }
    void print()
    { cout << '(' << x_ << "," << y_ << "," << z_ << ")";
    }
  private:
    float x_, y_, z_;
};

 

void main()
{ Point p(12,-3,4);
  cout << "p = ";
  p.print();
  cout << ", p.norm() = " << p.norm() << endl;
  p.negate();
  cout << "p = ";
  p.print();
  cout << ", p.norm() = " << p.norm() << endl;
}

 

2. 定义一个Person,它的每个对象表示一个人。数据成员必须包含姓名、出生年份、死亡年份,一个构造函数,一析构函数,读取数据的成员函数,一个print()成员函数显示所有数据。

 

#include <iostream.h>
class Person
{ public:
    Person(char* =0, int =0, int =0);
    ~Person() { delete [] name_; }
    char* name() { return name_; }
    int born() { return yob_; }
    int died() { return yod_; }
    void print();
  private:
    int len_;
    char* name_;
    int yob_, yod_;
};

 

void main()
{ Person cb("Charles Babbage",1792,1871);
  cb.print();
}

 

Person::Person(char* name, int yob, int yod)
        : len_(strlen(name)),
        name_(new char[len_+1]),
        yob_(yob),
        yod_(yod)
{ memcpy(name_, name, len_+1);
}

 

void Person::print()
{ cout << "\tName: " << name_ << endl;
  if (yob_) cout << "\tBorn: " << yob_ << endl;
  if (yod_) cout << "\tDied: " << yod_ << endl;
}