第三章課後習題

一、填空題

(1) 類定義中關鍵字private.publicprotected以後的成員的訪問權限分別是(私有)(共有)和(保護)。如果沒有使用關鍵字,則所有成員默認定義爲(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)以下不屬於類存取權限的是(B)

A.public  

B.static 
C.protected    
D. private

(2) 有關類的說法不正確的是(BC )

A.類是一種用戶自定義的數據類型

B.只有類的成員函數才能訪向類的私有數據成員

C.在類中,如不做權限說明,所有的數據成員都是公有的

D.在類中,如不做權限說明,所有的數據成員都是私有的


(3) 在類定義的外部,可以被任意麗數訪問的成員有(C)

A.所有類成員

B.private protected 的類成員

C.public 的類成員

D.public private 的類成員


(4)關於類和對象的說法(C )是錯誤的。

A 對象是類的一個實例

B,任何一個對象只能屬於一個具體的類

C,一個類只能有一個對象

D.    類與對象的關係和數據類型與變量的關係相似


(5) M Class 是一個類,dd是它的一個對象,PP是指向dd的指針,ccdd的引用,則對成員的訪問,對象dd 可以通過( B )進行,指針PP 可以通過( D )進行,引用cc 可以通過()進行。

A.::   
B. .   
C. &   
D.  >

(6) 關於成員函數的說法中不正確的是( C)

A.成員函數可以無返回值

B.成員函數可以重載

C.成員函數一定是內聯函數

D.成員函數可以設定參數的默認值


(7) 下面對構造函數的不正確描述是(B )

A.系統可以提供默認的構造

B.構造函數可以有參數

C.構造函數可以重載

D.構造函數可以設置默認參數


(8) 假定A 是一個類,那麼執行語句“Aa b(3).*p;”調用了(B)次構造函數。

A.1     

B.  2     
C. 3   
D.4

(9) 下面對析構函數的正確描述是 ( AC  )

A 系統可以提供默認的析構函數

B.    析構函數必須由用戶定義

C.    析構函數沒有參數

D.    析構函數可以設置默認參數


10)類的析構函數是(D)時被調用的。

A. 類創創建   

B. 創建對象   
C. 引用對象   
D.釋放對象

(11)建一個類的對象時,系統自動調用(B),撤銷對象時,系統自動調用(C)

A. 成員函數 

B.構造函數 
C.析構函數  
D.拷貝構造函數

(12)   通常拷貝構遺函數的參數是(C)
A.
某個對象名

B.   某個對象的成員名

C.某個對象的引用名

D.某個對象的指針名

(13) 關於this指針的說法正確的是(B)。

A.this 指針必須顯式說明

B.當創建一個對象後this指針就指向該對象

C.成員函數擁有this指針

D.靜態成員函數擁有this指針


(14) 下列關於子對象的描述中,(B)是錯誤的。

A.子對象是類的一種數據成員,它是另一個類的對象

B.子對象可以是自身類的對象

C.對子對象的初始化要包含在該類的構造函數中

D.一個類中能含有多個子對象作其成員


(15)new運算符的下列描述中,(B)是錯誤的。

A.它可以動態創建對象和對象數組

B.用它創建對象數組時必須指定初始值

C.用它創建對象時要調用構造函數

D.用它創建的對象數組可以使用運算符delete 來一次釋放


(16) delete運算符的下列描述中,( D )是錯誤的。

 A.用它可以釋放用new運算符創建的對象和對象數組

B.用它即第一個對象時,它作用於一個new所返回的指針

C.用它釋放一個對象教組時,它作用的指針名前須加下標運算符[]

D.用他可一次釋放用new運算符創建的多個對象


17)關於靜態數據成員,下面敘述不正確的是(C

A 使用靜態數據成員,實際是爲了消除全局變量

B.可以使用“對象名,靜態成員”或者“類名::靜態成員”來訪問靜態數據成員

C.靜態數據成員只能在靜態成員函數中引用

D.所有對象的靜態數據成員佔用同一內存單元


(18) 對靜態數據成員的不正確描述是( CD)

A.靜態成員不屬於對象,是類的共享成員

B.靜態數據成員要在類外定義和初始化

C.調用靜態成員函數時要通過類或對象激活,所以靜態成員函數擁this指針

D.只有靜態成員函數可以操作靜態數據成員


(19) 下面的選項中,靜態成員函數不能直接訪問的是( D )

A.靜態數據成員 

B,靜態成員函數
C.類以外的函數和數據  
D.非靜態數據成員


 (20) 在類的定義中,引人友元的原因是(A )

A.提高效率 

B.深化使用類的封裝
C.提高程序的可能性  
D.提高數據的隱祕性

21)友元類的聲明方法有(A)

A.friend class<類名>    

B.youyuan class<類名>
C.class friend <類名>  
D.friends class<類名>

(22) 下面對友元的錯誤描述是( D )

A.關鍵字friend 用於聲明友元

B.一個類中的成員函教可以是另一個類的友元

C.友元函數訪問對象的成員不受訪同特性影響

D.友元函數通過this 指針訪問對象成員


(23)下面選項中,(C)不是類的成員函數,

A.構造函數

B.析構函數

C.友元函數

D.拷貝構造函數


三、簡答題

(1) 類與對象有什麼關係?

答:類是一種用戶自己定義的數據類型,和其他數據類型不同的是,組成這種類型的不僅可以有數據,而且可以有對數據進行操作的函數。程序員可以使用這個新類型在程序中聲明新的變量,具有類類型的變量稱爲對象。創建對象時,類被用做樣板,對象稱爲類的實例。


(2) 類定義的一般形式是什麼? 其成員有哪幾種訪問權限?
答:定義類一般形式爲:
 class 類名
{
 public:
 < 公有數據和函數>
 protecled:
 <保護數據和函數>
 priva.e:
 <私有數據和函數>
};
訪問權限共有3種: 分別是公有(public)、保護(protected)和私有(private)。

    

(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];
  Test y(15);
  return 0;
}

輸出結果如下:

分析結果如下:
程序聲明瞭2個對象x、y,類中有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);
  cout<<"Exit main"<<endl;
return 0;
  }

輸出結果如下:

分析結果如下:
程序聲明瞭一個對象w;程序首先執行語句1,創建對象w,調用構造函數,nun得到初值5。程序接着執行語句2,輸出第1行結果。當程序結束時,釋放對象w,構造函數被調用,輸出第2 行結果。

(3)將例3.10 中的Whole 類如下修改,其他部分不變,寫出輸出結果。
class Whole
{
public :
Whole(int i);
Whole(){};
~Whole();
private:
Part pl;// 子對象1
Part p2;//1子對象2
Part p3;//子對象3
};
Whole::Whole(int i):p2(i),pl()
{
  cout<<"Constructor of Whole"<<endl;
}
  Whole::~Whole()
  {
  cout<<"Destructor of Whole"<<endl;
  }

完整程序如下:
#include<iostream>
using namespace std;
class Part
{
public:
Part();
Part(int x);
~ Part();
private:
int val;
};
Part::Part()
{
val=0;
cout<<"Default 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();
private:
Part pl;// 子對象1
Part p2;//1子對象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;
}

輸出結果如下:

(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;
int main ()
{
Book bl(20);
Book b2(70);
cout<<Book::sumnum<<endl;
return 0;
}


輸出結果如下:
結果分析如下:程序中語句1對靜態成員sumnun進行初始化。sumnum得到初值120,執行語句2 時,調用構造函數,sumnum 變爲100。接着語句3,再調用構造函數,sumnum變爲30。

五i、程序設計題
(1) 聲明一個Cirele 類,有數據成員radius (半徑)、成員麗數area (),計算圓的面積,構造一個Circle 的對象進行測試。

編寫程序如下:

#include<iostream>
using namespace std;
const float PI=3.14;
class Circle
{
    public:
        Circle(float r)
        {
            radius=r;
        }
         float area()
        {
            return radius*radius*PI;
        }
    private:
    float radius;
};
int main()
{
    Circle c(6);
    cout<<"圓的面積="<<c.area()<<endl;
}

運行結果如下:

2)重新編寫程序分析題(4)的程序,設計一個靜態成員函數,用來輸出程序分析題(4)中的靜態數據成員的值。

編寫的程序如下:

#include<iostream>  
using namespace std;  
class Book  
{  
    public:  
       Book(int w);  
       static int sumnum;  
       static int getsum()  
       {  
           return sumnum;  
       }  
    private:  
        int num;  
};  
Book::Book(int w)  
{  
    num=w;  
    sumnum-=w;  
}  
int Book::sumnum=120;  
int main()  
{  
    Book b1(20);  
    Book b2(70);  
    cout<<Book::getsum()<<endl;  
    return 0;  
}  

運行結果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章