本篇通過類來討論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所佔的記憶體比較小時具...