习题3

一、填空题

(1)类定义中关键字privatepublicprotected以后的成员的访问权限分别是私有公有保护。如果没有使用关键字,则所有成员默认定义为private权限。具有public访问权限的数据成员才能被不属于该类的函数直接访问。

(2)定义成员函数时,运算符“::”是作用域运算符,“myclass::”用于表明其后的成员函数是在myclass类中说明的。

(3)在程序运行时,通过为对象分配内存来创建对象。在创建对象时,使用类作为样板,故称对象为类的实例

(4)假定Dc是一个类,则执行“Dc a[10],b(2)”语句时,系统自动调用该类构造函数的次数为11.

(5)对于任意一个类,析构函数的个数最多为1个。

(6)delete运算符通常用于实现释放该类对象中指针成员指向的动态储存空间的任务。

(7)c++程序的内存格局通常分我4个区:数据、代码。栈、堆。

(8)数据定义为全局变量,破坏了数据的封装性;较好的解决方法是将所有共享的数据定义为类的静态成员

(9)静态数据成员和静态成员函数了由任意访问权限许可的函数访问。

(10)友元函数友元类统称为友元。

(11)友元的正确使用能提高程序的效率,但破坏了类的封装性和数据的隐蔽性。

(12)若需要把一个类A定义为一个类B的友元类,则应在类B的定义中加入一条语句:friend class A.

二、选择题

1~10 B BC C C BDB C B B AC D 

11~23 BC C B B B D  C CD D A A D C 

三、简答题

(1)类与对象有什么关系?

答:

对象:对象是人们要进行研究的任何事物,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。对象具有状态,一个对象用数据值来描述它的状态。对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为。对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中。

类:具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。

类与对象的关系就如模具和铸件的关系,类的实力化的结果就是对象,而对对象的抽象就是类,类描述了一组有相同特性(属性)和相同行为的对象。

(2)类定义的一般形式是什么?其成员有哪几种访问权限?

定义类一般形式为:

Class类名{

public:

(公有数据和函数)

protected:

(保护数据和函数)

private:

(私有数据和函数)

};

访问权限有三种,分别为:private、public和protected

(3)类的实例化是指创建类的对象还是定义类?

答:指创建类的对象。
(4)什么是this 指针?它的主要作用是什么?
答:this 指针是C++语言为成员函数提供的一个隐含对象指针,它不能被显式声明。this 指针是一个局部量,局部于某个对象。不同的对象调用同一个成员函数时,编译器根据this 指针来确定应该引用哪一个对象的数据成员。
(5)什么叫做拷贝构造函数? 拷贝构造函数何时被调用?
答:拷贝构造函数是一种特殊的构造函数,它的作用是用一个已经存在的对象去初始化另一个对象。为了保证所引用的对象不被修改,通常把引用参数声明为const参数。
在以下3种情况下,拷贝构造函数都会被自动调用:
当用类的一个对象去初始化该类的另- 一个对象时:
当函数的形参是类的对象,进行形参和实参结合时;
当函数的返回值是类的对象,函数执行完成返回调用者时。

四、程序分析题

(1)  #include<iostream>
  using namespace std;
  class Test
  {
  private:
     int num;
  public:
Test() ;// 默认构造函数
Test(int n); // 带一个参数构造函数
};
Test::Test()
{
cout<<"Init defa"<<endl;
num=0;
}
Test::Test(int n)
{
cout<<"Init"<<""<<n<<endl;
num=n;
}
int main()
{
Test x[2] ;// 语句1
Test y(15); // 语句2
return 0;
}
运行结果如下:

结果分析:

  1、程序声明了2 个对象x和y,类中有2 个构造函数。2、 程序首先执行语句1,创建对象x,调用默认构造函数。由于对象x 是对象数组,每个数组元素被创建时都要调用构造函数,所以默认构造函数被调用了2次,输出第1、2 行结果。程序接着执行语句2,创建对象y,调用带一个参数的构造函数,输出第3 行结果。

(2)

#include<iostream>
using namespace std;
class Xx
{
    private:
int num;
public:
Xx(int x){num=x;} // 构造函数
~Xx(){cout<<"dst"<<num<<endl;} // 析构函数
};


int main()
{
    Xx w(5);// 语句1
  cout<<"Exit main"<<endl; // 语句2
return 0;
}

运行结果:


结果分析:

   1、程序声明了一个对象w。
   2、程序首先执行语句1,创建对象w,调用构造函数,num 得到初值5。程序接着执行语句2,输出第1行结果。当程序结束时,释放对象w,析构函数被调用,输出第2 行结果。
(3)将例3.10中的Whole类如下修改,其他部分不变,写出输出结果

#include<iostream>
using namespace std;
class Part
{
public:
    Part();
    Part(int x);
    ~Part();
private:
    int val;


};
Part::Part()
{
    val=0;
    cout<<"Defauult constructor of Part "<<endl;


}
Part::Part(int x)
{
    val=x;
    cout<<"Constructor of Part "<<","<<val<<endl;
}
Part::~Part()
{
    cout<<"Destructor of Part"<<","<<val<<endl;


}
class Whole
{
public:
Whole(int i); // Whole 的有参构造函数
Whole(){}; // Whole 的无参构造函数
~Whole();// Whole 的析构函数
private:
Part pl;// 子对象1
Part p2;// 子对象2
Part p3;// 子对象3


};
Whole::Whole (int i):p2(i),pl()
{
    cout<<"Constructor of Whole"<<endl;
}
Whole::~Whole()
{
   cout<<"Destructor of Whole"<<endl;

}

int main()
{
    Whole w(3);
    return 0;
}

运行结果为:


结果分析:
   程序的Whole类中出现了类Part 的3 个对象P1、P2 和p3,作为该类的数据成员,则pl、P2 和P3 被称为子对象。当建立Whole类的对象w时,  子对象pl、P2和P3 被建立,相应的构造函数被执行。由于P1在Whole 类中先说明,所以先执行它所使用的构造函数,即类Part 的默认构造函数,接着P2 执行它所使用的有参构造函数,  紧接着初始化p3,由于Whole 类构造函数的成员初始化列表中没有子对象P3 进行初始化的选项,所以执行类Part 的默认构造函数,当所有子对象被构造完之后,对象w 的构造函数才被执行,从而得到前4 行输出结果,而后4 行是执行相应析构函数的输出结果。

(4)

 #include< iostream>
using namespace std;
class Book
{
public:
Book (int w) ;
static int sumnum;
private:
int num;
};
Book::Book (int w)
{
num=w ;
 sumnum-=w ;
}
int Book: :sumnum=120;// 语句1
   int main ()
{
  Book bl (20) ;// 语句2
  Book b2 (70) ;// 语句3
  cout<<Book: :sumnum<<endl;
  return 0;
}
运行结果:30
结果分析:
 sumnum 得到初值120。执行语句
程序中语句1对静态成员sumnum进行初始化,
2 时,调用构造函数,sumrum变为100。接着语句3,再调用构造函数,
sumnum
变为30。

五、程序设计题
(1)声明一个Circle类,有数据成员radius(半径),成员函数area(),计算圆的面积,构造一个Circle的对象进行测试。
  1. #include <iostream>   
  2. using namespace std;   
  3. class Circle  
  4. {  
  5. public:  
  6.  float GetArea();  
  7.     Circle();        //重载构造函数  
  8.    Circle(float r);//重载构造函数  
  9. public:  
  10.  float Radius;  
  11. };  
  12. Circle::Circle()  
  13. {  
  14.     Radius=1.0;  
  15. }  
  16. Circle::Circle(float r)  
  17. {  
  18.     Radius=r;  
  19. }  
  20. float Circle::GetArea()  
  21. {  
  22.  return Radius*Radius*3.14;  
  23. }  
  24. int main()   
  25. {   
  26.    Circle c1;  
  27.    cout<<"圆1的面积:"<<c1.GetArea()<<endl;  
  28.      
  29.    Circle c2(10);  
  30.    cout<<"圆2的面积:"<<c2.GetArea()<<endl;  
  31.    return 0;  
  32. }  
运行结果为:






阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页