1. 程式人生 > >侯捷 C++面向物件高階開發(上)筆記整理

侯捷 C++面向物件高階開發(上)筆記整理

C++面向物件高階開發(上)

一、C++程式設計簡介

(1)基於物件:只有一個class的程式設計 object based
面向物件:幾個class的程式設計 object oriented

(2)class的經典分類:

(A)class without pointer members ——>e.g: complex 複數

(B)class with pointer members  ——>e.g: string 字串

(3)class之間的關係:繼承inheritance、複合composition、委託delegation

(4)學習C++,分為學習C++語言 ,和C++標準庫

(5)C++書籍:語言的書籍《C++Primer》第五版,《C++programming Language》第四版

 提高書籍:《Effective C++ THird Edition》及中文版   《The C++ Standard Library》《STL原始碼剖析》(STL是標準庫的前身)

二、標頭檔案與類的宣告

(1)標準庫以標頭檔案的形式 存在,只需要include進去就好#include <*.h>

(2)C語言 #include<stdio.h> 或者 #include<cstdio>,而  C++:  #include<iostream>或者  #include<iostream.h>

(3)標頭檔案的佈局:

#ifndef __complex__

#define __complex__

  *******

##endif

 (4)class的佈局:

         class header 

         class body

三、建構函式

(1)inline函式:只要成員函式在class body裡面定義,不需要顯示宣告,就是inline函式,而如果在body之外定義,要想成為inline函式,必須顯示宣告。是否成為inline函式,由編譯器來決定,即使宣告為inline function,也不一定編譯器有能力使之成為inline function。

(2)access level 訪問級別:public ,private ,protected

private:資料的部分用盡量用private

public:函式的部分,大部分用public

(3)建構函式 :建立一個物件的時候,建構函式自動被呼叫,建構函式可設定默然引數,並用冒號設定引數初始化列表:

pair(const T1& a, const T2& b) : first(a), second(b) {}

引數initializition list和在body裡對引數賦值的區別:一個是引數初始化;一個是賦值,是一個執行的過程,多了計算量;

建立一個物件,可以有引數,也可以無引數,也可動態建立:complex *p = new complex(4);

class定義了多個建構函式,就是過載overloading

(4)友元函式:

四、引數傳遞和返回值

1、資料放在private裡
2、引數用reference,是否用const
3、返回值用reference傳
4、在類的body裡的函式是否加const
5、建構函式 的 initial list

五、操作符過載與臨時物件
1,、所有的成員的函式帶有一個隱藏的引數“this”,誰呼叫這個函式誰就是 this

臨時物件 complex() ——》typename();

2、在類外

Complex Complex::operator+=(complex &c2)

這個是成員函式 operator+= 的實現,所以需要 Complex:: ,具有this指標。例如:

inline complex&
complex::operator += (const complex& r)
{
  return __doapl (this, r);
}

而下面屬於運算子過載,不是成員函式的時候,就沒有Complex:: 。

inline complex
operator - (const complex& x, double y)
{
  return complex (real (x) - y, imag (x));
}

六、複習Complex類的實現過程

七、三大函式:拷貝構造,拷貝複製,析構
建構函式
拷貝建構函式
拷貝賦值函式
解構函式
——》只要類帶有指標,就一定需要 拷貝建構函式 和 拷貝賦值函式

淺拷貝——》拷貝建構函式 ,淺拷貝的影響:1、造成記憶體洩漏;2、造成有兩個指標 指向同一塊記憶體
深拷貝——》拷貝賦值函式 步驟:delete  ;new; strcpy;

class裡面有預設的拷貝構造和拷貝賦值函式。如果自己不定義一個拷貝建構函式,在呼叫拷貝建構函式的時候,就會呼叫預設的淺拷貝建構函式,就會造成問題,所以一定要自己定義拷貝建構函式——深拷貝。

八、堆,棧與記憶體管理
1、static local objects的生命週期

static的生命週期 :object的物件在scope結束以後仍然存在,直到整個程式結束;
非static 的生命週期:object的物件在在scope結束以後就結束了。

global objects的生命週期:

物件 objects 生命結束,就是什麼時候解構函式被呼叫:

2、new——》operator new。new動態建立物件,分三步:第一步,先轉化為operator new 函式,申請分配記憶體。第二步,做型別轉化。第三步,呼叫建構函式

delete ——》operator delete。刪除物件,分兩步:第一步,先呼叫解構函式,第二步,再呼叫operator delete函式。


3、帶中括號[ ]的new[ ]叫做array new,帶中括號[ ]的delete[ ]  叫做array delete。

 動態分配所得到的陣列array:complex *p = new complex[3];

new []  ——》delete[] ——》表示呼叫幾次解構函式
 new 字串 ——》delete 指標

delete[n] :array new一定要呼叫array delete,delete[n]會呼叫n次解構函式,而delete僅呼叫一次。

九、複習String類的實現過程


十、擴充套件補充:類模板,函式模板,及其他
    (1)static :靜態資料 不屬於某一個物件,而非靜態的是屬於一個物件的,這種情況需要設定為靜態資料。

            靜態函式 沒有this pointer,而非靜態函式有 this pointer,可以用this去取資料,靜態函式要處理資料只能處理靜態資料。

靜態資料一定要在class外面 定義。

    給變數賦值,使獲得記憶體的過程叫定義。  


    (2)template:類模板  函式模板
    (3)namespace:

十 一、組合與繼承
  (1)複合composition關係下的構造和析構:構造是由內而外,析構是由外而內 has-a,即先呼叫component的建構函式,再呼叫container的建構函式。

            計算記憶體的大小:複合類component的記憶體大小+container的記憶體大小

  (2)委託delegation,即composition by reference:在body中宣告一個 帶指標的 另一個類    composition by reference 

       生命時間:  classA 用一個指標指向classB,需要的時候才呼叫classB,而不是一直擁有classB。

  (3)繼承Inheritance:(三種繼承方式:public protected private)is-a,繼承主要搭配虛擬函式來使用

          函式的繼承:指的是繼承函式的呼叫權,子類可以呼叫父類的函式。

               計算記憶體的大小:先呼叫父類的建構函式,再呼叫子類的建構函式。先呼叫子類的析構,再呼叫父類的解構函式。

十二、虛擬函式與多型

(1)虛擬函式:virtual 

純虛擬函式:一定要重新定義。

(2)

 (A)Inheritance + composition下的構造和析構

 (B)delegation + Inheritance ——》 功能最強大的一種

 

十三、委託相關設計