2018年6月30日 星期六

錯誤總複習筆記

程式篇:(C++)

  • virtual function:
  1. abstract class: 擁有 pure virtual function 的類別,該類別只能被繼承,不能產生實例
  2. pure virtual function:指定函式只能提供一個介面,由子類別繼承,重新定義
  3. polymorphic class:擁有多個 virtual functions
  • redefinition ,overriding差別:
  1. redefinition(重新定義):不限制為虛函數,在衍生類別中,重新定義子函式
  2. overriding(複寫):重定的對象是virtual function就為override,若想要複寫基礎類別而不是繼承別人的話,用override,若不想被繼承,用final,用來避免虛擬函式被複寫
  • 編譯器還為每個類別加上一個VTABLE,VPTR指向VTABLE的開頭。 VTABLE 紀錄了基礎類別內被宣告為 virtual function 的成員函數。
  • 若沒overriding,就記錄基礎類別的位址
  • 解構時必須把解構函數宣告成virtual function ,才能釋放 VPTR VTABLE,否則memory leak

  • Pointer&Reference:

void swap (int *c , int *d){
   int temp=*c;
   *c=*d;
   *d=temp; "做deference,對指定位址的值做交換"
}
int main(){
   int a=5,b=10;
   swap(&a,&b);
   printf(" %d %d ", a,b);
}

  • (如上)對指定位址的值做交換,本身位址是不變的
  • void swap (int &c , int &d){
       int temp=c;
       c=d;
       d=temp;
    }
    int main(){
       int a=5,b=10;
       swap(a,b);
       printf(" %d %d ", a,b);
       return 0;
    }
  • 傳參考就直接控制本人

  • 有關指標:

  • 基本上,int *a=&b;(位址需要 非 常數)
  • 但是,請看如下例題:
int *p1;int *p2;
p1=new int;p2=new int;
*p1=0;p2=0;p2=p1;//deference 直接指值是被允許的,bc有allocate memory
*p2=1;*p1=3;p1=0;
//p1已經被p2定址到0身上了,所以p1已有定址,但是,由於定址後不能再改變位址,p1=0及不成立,
雖然都為零,但是為重複定義,就會出現錯誤

  • 封裝:nest class,local class Vs.private,protected
  • public:當資料可以給user、自己和derived class存取時使用。
    protected:當資料不可以給user存取,只能給自己和derived class存取時使用。
    private:當資料不可以給user和derived class使用,只可以給自己存取時使用。
    friend:指定一個global function可存取private資料。
  • 遇到Nest class&local class時,封裝可能被會產生質疑:
  • Nest class:
          內部類別不能存取外部類別的private成員,外部類別亦不能存取內部的private成員
           (就算彼此層層相扣,環環相護,private就是不能動)
  • Local class:
類別可以定義於函式中,但不能存取函式中的變數,能存取外部類別的private成員

  • 重載運算符:
  • <.   ::   .*   ?:>不能重載運算子
  • 所接收的物件引數來自被重載的運算子右邊
  • Point2D operator+(const Point2D&); // 重載+運算子 (const Point2D&)因為要整陀丟入
    Point2D operator-(const Point2D&); // 重載-運算子 
    Point2D& operator++(); // 重載++前置,例如 ++p (使用Point2D&的原因是因為,前置++作修改)
    Point2D operator++(int); // 重載++後置,例如 p++
    Point2D& operator--(); // 重載--前置,例如 --p 
    Point2D operator--(int); // 重載--後置,例如 p--
  • p1+p2;

  • C++ v.s. Java  ((C++)reference and pointer,(J)only reference)

  •         C++                        Java++
    copy      複製一份內容數值                                      複製一份參考給別人 

        C++中的參考,必須在宣告時就指定其所指之處,且不得改變                                                                                                              指向同份object的數值
    C++:
    Java:
    Point p1(5,5);
    p1
    XXXX : 0000
    5
    XXXX : 0004
    5
    XXXX : 0008
    XXXX : 000C
    Point p1 = new Point(5,5);
    p1
    XXXX : 0000
    XXXX : 0100
    XXXX : 0004
    XXXX : 0008
    XXXX : 000C
    . . .
    Instance of
    XXXX : 0100
    5
    Point Object
    XXXX : 0104
    5
    XXXX : 0108
    XXXX : 010C

    Point p2 = p1;
    p1
    XXXX : 0000
    5
    XXXX : 0004
    5
    p2
    XXXX : 0008
    5
    XXXX : 000C
    5
    Point p2 = p1;
    p1
    XXXX : 0000
    XXXX : 0100
    p2
    XXXX : 0004
    XXXX : 0100
    XXXX : 0008
    XXXX : 000C
    . . .
    Instance of
    XXXX : 0100
    5
    Point Object
    XXXX : 0104
    5
    XXXX : 0108
    XXXX : 010C


    • (c++)Point& p2 = p1;指向同塊記憶體
    • Pointer p3(7,7);
    • p2=p3;複製一份p2給p3;
    • C++的參考,比較常用的場合是在呼叫函式時























  • Dymanic Memory
  • malloc-安排空間,未安排初始值
  • calloc-安排空間,安排初始值0
  • realloc-重新安排指定空間
  • free-釋放空間

沒有留言:

張貼留言

Ethereum- Learn Solidity step by step

Common Function Types: public: Anyone can call this function,but it isn't really used for any type of security per se. priv...