第8章類與物件
8.1知識要點
1.掌握類與物件的概念和定義方法,掌握類成員的訪問屬性。
2.掌握建構函式的概念、定義方法和使用方法。
3.掌握析構函式的概念、定義方法和使用方法。
4.掌握拷貝建構函式的概念、定義方法和使用方法。
5.掌握包含物件成員的類建構函式的定義方法。
6.掌握靜態成員的概念、定義方法、作用和特點。
7.掌握友元的概念、定義方法、作用和特點。
8.掌握類模板的定義格式與使用方法。
8.2典型例題分析與解答
例題1:下列有關類的說法不正確的是( )。
a.物件是類的乙個例項
b.任何乙個物件只能屬於乙個具體的類
c.乙個類只能有乙個物件
d. 類與物件的關係和資料型別與變數的關係相似
答案:c
分析:物件是類的乙個例項,類與物件的關係和資料與變數的關係相似,所以乙個類可以有多個物件。
例題2:下面( )項是對建構函式和析構函式的正確定義。
a.void x::x(), void x::~x()
b.x::x(引數),x::~x()
c.x::x(引數),x::~x(引數)
d.void x::x(引數),void x::~x(引數)
答案:b
分析建構函式無返回型別、可帶引數、可過載;析構函式無返回型別、不可帶引數、不可過載。
例題3:( )的功能是物件進行初始化。
a.析構函式b. 資料成員 c.建構函式 d.靜態成員函式
答案:c
分析:當乙個物件定義時,c++編譯系統自動呼叫建構函式建立該物件並進行初始化;當乙個物件的生命週期結束時,c++編譯系統自動呼叫析構函式登出該物件並進行善後工作;
例題4:下列表達方式正確的是( )。
a.class p; }
c. class p; int a;
f=25; void seta (int x)
答案:d
分析:在類體內不可對資料成員進行初始化;類定義結束時需用分號;只有類中的成員函式才能訪問類中的私有資料。
例題5: 拷貝建構函式具有的下列特點中,( )是錯誤的。
a.如果乙個類中沒有定義拷貝建構函式時,系統將自動生成乙個預設的
b.拷貝建構函式只有乙個引數,並且是該類物件的引用
c.拷貝建構函式是一種成員函式
d. 拷貝建構函式的名字不能用類名
答案:d
分析:如果乙個類中沒有定義拷貝建構函式時,系統將自動生成乙個預設的;拷貝建構函式只有乙個引數,並且是該類物件的引用;拷貝建構函式的名字與類同名,並且不被指定返回型別;拷貝建構函式是一種成員函式。
例題6:關於靜態成員的描述中,( )是錯誤的。
a.靜態成員可分為靜態資料成員和靜態成員函式
b.靜態資料成員定義後必須在類體內進行初始化
c.靜態資料成員初始化不使用其建構函式
d.靜態資料成員函式中不能直接引用非靜態成員
答案:b
分析:靜態成員可分為靜態資料成員和靜態成員函式;靜態資料成員被定義後,必須對它進行初始化,初始化在類體外進行,一般放在該類的實現部分最合適,也可以放在其他位置,例如,放在主函式前面等;靜態資料成員初始化與該類的建構函式和析構函式無關;在靜態成員函式的實現中,可以直接引用靜態成員,但不能直接引用非靜態成員。
例題7:關於友元的描述中,( )是錯誤的。
a.友元函式是成員函式,它被說明在類體內
b. 友元函式可直接訪問類中的私有成員
c. 友元函式破壞封裝性,使用時盡量少用
d. 友元類中的所有成員函式都是友元函式
答案:a
分析:友元函式是非成員函式,在類體內說明了,在類體外定義,定義和呼叫等同於一般的普通函式;由於它可以直接訪問類的私有成員,因此破壞了類的封裝性和隱藏性,盡量少用。
例題8:設有如下程式結構:
class box
;void main()
該程式執行時呼叫 (1) 次建構函式;呼叫 (2) 次析構函式。
答案:(1)3(2)3
分析:每建立乙個物件自動呼叫一次建構函式,在這裡建立了a、b、c三個物件,所以共呼叫了三次建構函式;每釋放乙個物件,系統自動呼叫一次析構函式,a、b、c物件釋放時,分別呼叫析構函式,所以析構函式共呼叫了三次。
例題9:設a為test類的物件且賦有初值,則語句test b(a); 表示。
答案:將物件a複製給物件b。
分析:執行test b(a);語句相當於呼叫了預設複製建構函式,將a物件的屬性複製給b物件。
例題10:利用「物件名.成員變數」形式訪問的物件成員僅限於被宣告為 (1)的成員;若要訪問其他成員變數,需要通過 (2) 函式或 (3) 函式。
答案:(1) public (2) 成員函式 (3)友元函式
分析:類體內的資料成員可宣告為公有的、私有的和保護的,公有的資料成員可利用「物件名.成員變數」形式來進行訪問;私有的資料成員能被類中的其他成員函式或友元函式所呼叫;保護的資料成員可以在類體中使用,也可以在派生類中使用,但不能在其他類外通過物件使用。
例題11:分析找出以下程式中的錯誤,說明錯誤原因,給出修改方案使之能正確執行。
#include<>
class one
;void main()
分析:出錯原因:建構函式參數列語法錯;建構函式沒有函式體;類的物件不能直接訪問類的私有成員變數。
改正後的程式如下:
#include<>
class one
int geta1()
int geta2()
};void main()
例題12:分析以下程式的錯誤原因,給出修改方案使之能正確執行。
#include <>
class amplifier
float gain();
};amplifier::float gain()
void main()
分析:成員函式在類體外定義格式是:函式返回型別類名::成員函式名(參數列);成員函式呼叫格式是:物件名.成員函式名(參數列)。
改正後的程式如下:
#include <>
class amplifier
float gain();
};float amplifier::gain()
void main()
例題13:下列程式的執行結果是 。
#include <>
class point
point(point &p);
friend point move(point q);
~point()
int getx()
int gety()
};point::point(point &p)
point move(point q)
void main()
分析:根據建構函式、拷貝建構函式和友元函式的特點,執行該程式後,輸出結果是:
calling the constructor function.
calling the constructor function.
calling the copy_initialization constructor function.
calling the copy_initialization constructor function.
ok!calling the constructor function.
calling the copy_initialization constructor function.
類圖練習題
專題三 類圖 物件圖 一 單項選擇題 1 在uml中,類之間的關係有一種為關聯關係,其中多重性用來描述類之間的對應關係,下面哪個不是其中之一 a.0 1 b.0 c.1 d.2 通常物件有很多屬性,但對於外部物件來說某些屬性應該不能被直接訪問,下面哪個不是uml中的類成員訪問限定性 a.公有的 pu...
C類和物件
1.物件導向設計簡介 1 2.物件的初始化與清除 物件賦值 6 2.1.建構函式 6 2.2.初始化成員列表 引數初始化表 9 2.3.析構函式 10 3.物件與常量 10 4.靜態成員 11 5.友員 12 5.1.友員函式 12 5.2.友員成員函式 13 5.3.友員類 13 物件導向程式設計...
類與物件部分習題
一.基本概念與基礎知識自測題 1 填空題 1 引入類定義的關鍵字是 1 類的成員函式通常指定為 2 類的資料成員通常指定為 3 指定為 4 的類成員可以在類物件所在域中的任何位置訪問它們。通常用類的 5 成員表示類的屬性,用類的 6 成員表示類的操作。答案 1 class 2 公有的public 3...