1.2 友元類
2. 類的組合
3. 共享資料的保護
3.2 常物件
3.3 常物件成員
3.4 說明
友元函式不是當前物件的成員函式,但它可以訪問該類的所有成員。
在類中宣告友元函式時,需在其函式名前加上關鍵字friend
。此宣告可放在公有私有保護部分。可以定義在類的內部,也可以定義在類的外部。
class
stufriend
intfunction
(stu &obj);}
;int
function
(stu &obj)
注意
(1) 友元函式不是成員函式,在類外定義時,不必加上類名::
。
(2) 友元函式不是類的成員,它不能直接訪問物件的資料成員,也不能通過this
指標訪問物件的資料成員,它必須通過作為入口引數傳遞進來的物件名(或物件指標、物件引用)來訪問物件的資料成員。
(3) 友元提供了不同類之間的成員函式之間、類的成員函式與一般函式之間進行資料共享的機制。尤其當乙個函式需要訪問多個類時,友元函式十分有用,普通成員函式只能訪問其所屬的類,但是多個類的友元函式能夠訪問相關的所有類的資料。
乙個類的成員函式也可以作為另乙個類的友元函式,它是友元函式的一種,稱為友元成員函式。友元成員函式不僅可以訪問自己所在類中的所有資料,也可以訪問friend
宣告所在類的物件中的所有成員。
注意(1) 乙個類的成員函式作為另乙個類的友元函式時,必須先定義這個類。並在宣告友元函式時,要加上成員函式所在的類名
friend
void stu::
showstuscore
(score &sc)
;
(2) 注意向前引用 記得提前宣告
友元類的說明方法是friend 類名;
此語句可以放在公有部分也可以放在私有部分
例如
classy;
class
x;
當乙個類被說明為另乙個類的友元類時,它的所有成員函式都成為另乙個類的友元函式。
友元關係是單向的,不具有交換性。
友元關係也不具有傳遞性。
複雜的物件可以由比較簡單的物件以某種方式組合而成,複雜物件和組成它的簡單物件之間的關係是組合關係。
在類中內嵌另乙個類的物件作為資料成員,稱為類的組合。該內嵌物件稱為物件成員,又稱子物件。
例如
classy;
class
x;
使用物件成員要著重注意的問題是物件成員的初始化,即類x的建構函式如何定義的問題。
當建立類的物件時,如果這個類有內嵌的物件成員,那麼內嵌物件成員也將被自動建立。因此,在建立物件時既要對本類的資料成員初始化,又要對內嵌的物件成員進行初始化。
class
x;
一般來說,類x的建構函式的定義形式如下
x::
x(形參表0
):物件名1
(形參表1),
..., 物件名n
(形參表n)
冒號後面的部分是物件成員初始化列表,各物件成員的初始化列表用逗號分隔。
當呼叫建構函式x::x()
時首先,按各物件成員在類宣告中的順序依次呼叫它們的建構函式,對這些物件成員初始化。最後,再執行x::x()
的建構函式體初始化類中的其它成員。
析構函式的呼叫順序與建構函式的呼叫順序相反。
注意(1) 宣告乙個含有物件成員的類,首先要建立各成員物件。
(2) 在呼叫建構函式初始化的同時,也要對物件成員進行初始化,因為它也屬於此類的成員
在說明引用時用const修飾,則被說明的引用為常引用。常引用所引用的物件不能被更新。
如果用常引用作為形參,便不會產生對實參的不希望的更改。
const 型別& 引用名;
例如
int a=5;
const
int& b=a;
//b是a的乙個引用,它所引用的物件,不允許被改變 如b=12;就是錯誤的。
#include
using
namespace std;
intadd
(const
int&
,const
int&);
intmain()
intadd
(const
int& i,
const
int& j)
//函式add形參是常引用
在說明物件是用const修飾,則說明的物件為常物件。常物件中的資料成員為常量且必須要有初值。常物件中的資料成員值在物件的整個生存期內不能被改變。
類名 const 物件名[
(參數列)
];
或
const 類名 物件名[
(參數列)
];
在定義物件時必須初始化,而且不能被更新。
注意常物件不能呼叫普通的成員函式,只能呼叫常成員函式。
c++ 可以在宣告類時將其中的成員宣告為const
,即宣告為常資料成員和常成員函式。
類的資料成員可以是常量或常引用,使用const
說明的資料成員稱為常資料成員。
只能通過建構函式初始化列表對其初始化,其他任何函式都不能對該成員賦值。
例如程式中定義如下常資料成員
const
int year;
const
int month;
const
int day;
建構函式格式如下
date::
date
(int y,
int m,
int d)
:year
(y),
month
(m),
day(d)
//在函式體中直接賦值是非法的
常資料成員初始化之後值是不能被改變的。
在類中使用const
說明的函式為常成員函式。
3.3.2.1 常成員函式的說明形式
型別 函式名(參數列)
const
;
const
是函式型別的乙個組成部分,因此在宣告函式和定義函式時都要有關鍵字const
在呼叫時不必加。
(1) 常成員函式可以訪問二常資料成員,也可以訪問普通資料成員。常資料成員可以被常成員函式訪問,也可以被普通成員函式訪問。
普通成員函式和常成員函式的訪問特性比較
函式型別
普通資料成員
常資料成員
常物件的資料成員
普通成員函式
可以訪問,也可以改變值
可以訪問,不可以改變值
不允許訪問和改變值
常成員函式
可以訪問,不可以改變值
可以訪問,不可以改變值
可以訪問,可以改變值
(2) 如果將乙個物件說明為常物件,則通過該物件只能呼叫它的常成員函式,不能呼叫普通成員函式。
(3) 常成員函式不能更新物件的資料成員,也不能呼叫該類的普通成員函式。
C 學習筆記(二)
在學習最新的c 標準過程中會碰到很多新問題,這些問題有時候很難理解為什麼會發生。更奇怪的是,似乎跟開發工具有關。如下面這個在vs2005下的例子 word istatus ifstream ifs if i it szprlfile,0 0 std locale global std locale ...
C 學習筆記二
chapter22 滾動字幕程式 1.ondraw函式中寫畫得內容.使用invalidate 或者 invalidaterect 重新整理 觸發ondraw 得呼叫.2.windows不允許直接 訪問顯示硬體 我們必須通過和視窗 關聯得 裝置環境 跟顯示硬體 通訊 裝置環境由c 得cdc類 物件表示...
C 學習筆記(二)
本期話題 字串文字常量,指標,引用 1 關於字串文字常量 sizeof bohr 5 字串文字常量的型別是 適當個數的const字元的陣列 所以 bohr 的型別就是const char 5 下面的賦值是可以的 char p bohr 因為在c c 原來的定義裡,字串文字常量的型別就是char 字串...