C 學習筆記 二

2021-10-24 21:56:55 字數 3773 閱讀 1382

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 字串...