C 物件導向高階程式設計 一 基礎篇

2022-08-31 17:27:11 字數 3346 閱讀 3936

概要:知識點1 建構函式與析構函式

知識點2 引數與返回值

知識點3 const

知識點4 函式過載(要與重寫區分開)

知識點5 友元

先以c++的兩大經典class(complex 不含指標,   string 含指標)之一 complex(複數類) 做例子.

#ifndef complex_hpp //

防止標頭檔案重複

#define complex_hpp#include

class

complex

//知識點2 引數與返回值(見下文)

complex& operator += (const complex& r);

//知識點3 const(見下文)

double real() const

double imag() const

//知識點4 函式過載(見下文)

void real(double

r);

private

:

double

re,im;

//知識點5 友元(見下文)

friend complex& __doapl (complex*, const complex&);

};//

知識點6 內聯(見下文)

inline complex&__doapl (complex* ths, const complex&r)

#endif /* complex_hpp */

知識點1 建構函式與析構函式

a. 建構函式不可以直接呼叫,他是有我們建立之後自動呼叫的函式 

b.上面我寫的是帶初省值的建構函式(就是帶紅色:),則你不可以再宣告不帶引數而帶有出省值的建構函式

complex () : re(0) , im(0) {}  //

如果你在宣告這樣的建構函式 會報錯.因為下面的兩個初始化 編譯器會識別不出該呼叫哪個

complex c1;

complex c2();

c.如果將建構函式與析構函式宣告private許可權下,則外界不可以隨便建立該物件,應用例項單例設計模式(這個我會在c++設計模式的文章中做詳細介紹)

d.可用下面三種方式建立物件

complex c2;//

預設構建 棧

complex c1(2,1);//

初始值構建 棧

complex* p = new complex(4);//

動態構建 堆

e.析構函式,不可以直接呼叫,物件銷毀時自動呼叫,不帶指標的類多半可以不用寫析構函式

f.物件的建立有兩個過程 1.初始化,2.賦值,所以帶出省值的建構函式(給成員變數賦值)比 不該出省值的建構函式內部賦值 建立物件更有效率

知識點2 引數與返回值

引數 : 引數傳遞的三種形式 pass by value(將整包東西穿過去,效率低) , pass by pointer(傳遞指標), pass by reference(傳遞引用,類似指標,建議使用)

a.介紹一下引用,引用相當於取別名,必須初始化,之後不能再引用其他變數,不能引用null

b.傳遞引用效率高,且比傳遞指標更加漂亮,傳遞引用4位元組(你可能會說傳遞char 1位元組,比引用快,具體情況具體分析嘛)

void func_int(int a); //

pass by value

void func_char(char* i);//

pass by point

void func()_class(const complex&);//

pass by reference

返回值 : 三種形式同引數,效率任然是by reference更高,但是要注意,不要返回區域性物件的引用

錯誤例項

int&func()

知識點3 const

先介紹一下const的作用,使"其"不能變.

a.const宣告普通變數, 即常量,必須初始化 

const

int a = 10;

b.const宣告指標

const

int* p1;//

不能改變其指向的資料

intconst *p2;//

同上int* const p3;//

不能改變其指向

c.const宣告成員變數,常量成員,需要在建構函式中初始化

d.const宣告函式 

//

在class中

const

void func(); //

不能呼叫非const成員函式

像complex中函real()的const

double real() const //

可以理解成常量成員函式 const member functions 不可以改變變數 只能get 不能set

//如果你不宣告const的話

const complex c1(2,1

); cout

<< c1.real(); //

會報錯 --- 因為c1是const變數 該函式可能修改其變數

要大膽的使用const,會給你帶來無限的好處.

知識點4 函式過載(要與重寫區分開)

a.不同的函式可以具有相同的函式名,前提是形參列表不同(引數個數不同,引數型別不同)

b.不能通過返回值得型別不同進行函式過載

知識點5 友元

a.frend宣告的函式 優點:實現類之間資料共享時,減少系統開銷,提高效率 . 缺點 友元函式破環了封裝機制

b.同乙個class的各個object 互為 friend (友元)

complex c1(2,1

);complex c2;

//c1與c2互為友元

c.高效率

friend complex& __doapl (complex*, const complex&); //

可以直接使用其私有成員變數 效率會高於其他函式如"set()"函式

知識點6 內聯

a.inline內聯函式,效率高,即使你將函式宣告稱inline也可能內聯不成功,內聯函式實現控制在5行內.

效率與推薦

a.  帶出省值的建構函式

b.  return/pass by reference

c.  友元

d.  內聯

e.  move() //我在格式工廠(四)中有介紹

如有不正確的地方請指正

參照《侯捷 c++物件導向高階程式設計》

C 物件導向高階程式設計 三 基礎篇

概要一.拷貝構造 二.拷貝賦值 三.重寫操作符 四.生命週期 本節主要介紹 big three 即析構函式,拷貝建構函式,賦值拷貝函式,前面主要圍繞不帶指標的class complex本節中主要圍繞帶指標的string類 前面我說過如果你建立的類不帶有指標,那麼多半你可以不用寫析構函式,但是如果你建...

C 物件導向高階程式設計 四 基礎篇

一.static 二.模板類和模板函式 三.namespace 一.static 靜態成員是 類級別 的,也就是它和類的地位等同,而普通成員是 物件 例項 級別 的.類級別的成員,先於該類任何物件的存在而存在,它被該類所有的物件共享.static 1.修飾變數,該變數時全域性變數,其實靜態變數不歸屬...

物件導向高階程式設計

相同class的各物件互為友元 class complex int func const complex param private double re,im string inline string string const char cstr 0 else inline string strin...