C 封裝專題

2021-09-27 09:34:59 字數 3892 閱讀 4457

本篇通過類來討論c++中封裝的問題。

不是全面講述封裝,是摘錄一些我學習過濾後覺得值得注意的一些點。

1.訪問控制

public,private,protected

2.建構函式。

建構函式需要考慮多種情況,

(1)預設(無參或有預設引數)建構函式,(若不定義則由系統自動生成)

這個必須有生成陣列的時候會用到

(2)有參建構函式

(3)拷貝建構函式(此種情況通過類物件a來初始化新建物件),有深拷貝和淺拷貝的問題。 (當類物件中有通過指標new的記憶體時,要執行深拷貝,否則兩個指標指向同一塊記憶體,會在析構時重複析構而出現錯誤)

mystring::mystring(const mystring & other)

strcpy(this->_str,other._str); //拷貝

}

3.拷貝構造可與賦值運算子過載對比,賦值運算子過載中需要考慮將物件本身賦給自己的情況,而拷貝構造不需要。

mystring & mystring::operator=(const mystring & another)

}

strcpy(this->_str,another._str);
賦值運算子過載返回的是引用,這樣可以實現連=操作。

要先釋放原先的記憶體,重新申請相應大小並拷貝內容 。

4.加法運算子過載

計算總記憶體長度,釋放原有記憶體,申請相加長度後的記憶體,清零,賦值

mystring mystring::operator+(const mystring & other)

strcat(str._str,other._str);   //相加
5.const 修飾類的成員變數,表示成員常量,不能被修改,同時它只能在初始化列表中賦值

class a

private:

const int ivalue;

6.常成員函式

const 修飾函式的意義

承諾在本函式內部不會修改類內的資料成員,不會呼叫其它非 const 成員函式

類體外定義的 const 成員函式,在定義和宣告處都需要 const 修飾符。 加在末尾

const 構成函式過載

class a

void dis() const //const 物件呼叫時,優先呼叫

void

select

(int idx,

int val)

intcount()

private

:voidf(

int val)

voidg(

int val)

voidh(

int val)

voidi(

int val)

enum

;void

(widget::

*fptr[cnt])(

int);}

;int

main()

return0;

}

//指向類靜態成員的指標

int*p =

& a::data;

cout<<

*p

(*pfunc)()

=&a::dis;

9.前向宣告

前向宣告,是一種不完全型(forward declaration)宣告,即只需提供類名(無需提供類實現)即可。正因為是(incomplete type)功能也很有限:

(1)不能定義類的物件。

(2)可以用於定義指向這個型別的指標或引用

(3)用於宣告(不是定義),使用該型別作為形參型別或者函式的返回值型別

class

point

;//前向宣告

class

managerpoint

;class

point

void

getxy()

;friend

double managerpoint::

distance

(point &a, point &b);}

;

宣告為誰的友元,就可以通過誰的物件訪問誰的私有成員

這裡managerpoint::distance宣告為point的友元,就能通過point的物件,訪問point的私有成員

10.友元類

友元類的所有成員函式都是另乙個類的友元函式,都可以訪問另乙個類中的隱藏資訊(包

括私有成員和保護成員)。

當希望乙個類可以訪問另乙個類的私有成員時,可以將該類宣告為另一類的友元類。定義友元類的語句格式如下:

friend class 類名;

class

a;

類 b 是類 a 的友元類,類 b 的所有成員函式都是類 a 的友元函式,能訪問類 a 的私有成員和保護成員

11.用型別轉換建構函式進行型別轉換

explicit

point3d

(point2d &p)

//注:explicit 是個僅用於宣告的關鍵字

12.用型別轉換操作符進行轉換

class 源類

}point2d::

operator

point3d()

13.函式操作符(())—仿函式(把類物件像函式名一樣使用)

實現乙個operator(),這個類就有了類似函式的行為

class 類名

#include

#include

using

namespace std;

class

powdouble

operator()

(double d)};

intmain()

14.**類,

通過向客戶提供只知道類的 public 介面的**類,就可以使客戶能夠使用類的服務,而無法訪問類的實現細節。

#include

using

namespace std;

class

implementation

void

setvalue

(int v)

intgetvalue()

const

private

:int value;};

class

delegate

void

setvalue

(int v)

intgetvalue()

const

private

: implementation * pi;};

intmain()

特別關注此處pi物件的申請記憶體及初始化!

delegate(int v):pi(new implementation(v))

c語言專題

本篇作為乙個引子,領著大家梳理c語言中難點或容易忽視的知識點,知識點以專題形式展開。專題一 結構占用記憶體長度 在linux windows上執行下面一段程式,你能總結出struct記憶體對齊規則嗎?struct ta struct tb struct tc printf size ta d tb ...

c 引用專題

引用專題 0變數名回顧 變數名實質上是一段連續儲存空間的別名,是乙個標號 程式中通過變數來申請並命名記憶體空間 通過變數的名字可以使用儲存空間 問題1 對一段連續的記憶體空間只能取乙個別名嗎?1 引用是c 的概念,屬於 c 編譯器對 c的擴充套件 問題 c 中可以編譯通過嗎?int main int...

c 專題 結構

一 我們什麼時候建立strucut?什麼時候使用類,參考以下兩點 1 當c 的預定義型別,比如int double等不能滿足我們的需求的時候,比如我們想定義乙個座標,該座標有x,y,z,並且都是double型別,那我們就可以考慮使用struct或者class,但是由於stuct所佔的記憶體比較小時具...