48
VIỆC KHỞI TẠO ĐỐI TƯỢNG, HÀM BẠN VÀ LỚP BẠN ThS. Trần Anh Dũng

Chuong 04 - Viec Khoi Tao Doi Tuong, Ham Ban, Lop Ban

Embed Size (px)

Citation preview

  • VIC KHI TO I TNG, HM BN V

    LP BN

    ThS. Trn Anh Dng

  • Ni dung

    i tng l thnh phn ca lp

    i tng l thnh phn ca mng

    i tng c cp pht ng

    Hm bn

    Lp bn

    Cc nguyn tc xy dng lp

    14/09/2014 Lp trnh hng i tng 2

  • i tng l thnh phn ca lp

    i tng c th l thnh phn ca i tng

    khc, khi mt i tng thuc lp ln c to

    ra, cc thnh phn ca n cng c to ra.

    14/09/2014 Lp trnh hng i tng 3

  • i tng l thnh phn ca lp

    Phng thc thit lp (nu c) s c t ng

    gi cho cc i tng thnh phn.

    Khi i tng kt hp b hy i tng thnh

    phn ca n cng b hy, ngha l phng thc

    hy b s c gi cho cc i tng thnh

    phn, sau khi phng thc hy b ca i tng

    kt hp c gi.

    14/09/2014 Lp trnh hng i tng 4

  • i tng l thnh phn ca lp

    Nu i tng thnh phn phi cung cp tham

    s khi thit lp th i tng kt hp (i tng

    ln) phi c phng thc thit lp cung cp

    tham s thit lp cho cc i tng thnh phn.

    C php khi ng i tng thnh phn l

    dng du hai chm (:) theo sau bi tn thnh

    phn v tham s khi ng.

    14/09/2014 Lp trnh hng i tng 5

  • V d

    14/09/2014 Lp trnh hng i tng 6

    class TamGiac{

    Diem A, B, C;

    public:

    TamGiac(double xA, double yA, double xB, double yB,

    double xC, double yC) : A(xA,yA), B(xB,yB),C(xC,yC){

    }

    void Ve();

    // ...

    };

    TamGiac t(100,100,200,400,300,300);

    {

  • V d

    14/09/2014 Lp trnh hng i tng 7

    class TamGiac{

    Diem A,B,C;

    int loai;

    public:

    TamGiac(double xA, double yA, double xB, double yB,

    double xC, double yC, int l): A(xA,yA), B(xB,yB),

    C(xC,yC), loai(l) {

    }

    void Ve();

    // ...

    };

    TamGiac t (100, 100, 200, 400, 300, 300, 1);

    C php du hai chm cng c dng cho i tng thnh phn thuc kiu c s

    ?

  • V d

    14/09/2014 Lp trnh hng i tng 8

    class Diem{

    double x,y;

    public:

    Diem(double xx = 0, double yy = 0) : x(xx), y(yy){

    }

    void Set(double xx, double yy){

    x = xx;

    y = yy;

    }

    };

    ?

  • i tng l thnh phn ca mng

    14/09/2014 Lp trnh hng i tng 9

  • i tng l thnh phn ca mng

    Khi mt mng c to ra cc phn t ca n

    cng c to ra phng thc thit lp s

    c gi cho tng phn t.

    V khng th cung cp tham s khi ng cho tt

    c cc phn t ca mng khi khai bo mng,

    mi i tng trong mng phi c kh nng t

    khi ng, ngha l c th thit lp khng cn

    tham s.

    14/09/2014 Lp trnh hng i tng 10

  • i tng l thnh phn ca mng

    i tng c kh nng t khi ng trong

    nhng trng hp no?

    1. Lp khng c phng thc thit lp

    2. Lp c phng thc thit lp khng

    tham s

    3. Lp c phng thc thit lp m mi

    tham s u c gi tr mc nhin

    14/09/2014 Lp trnh hng i tng 11

  • i tng l thnh phn ca mng

    14/09/2014 Lp trnh hng i tng 12

    class Diem

    {

    double x,y;

    public:

    Diem(double xx, double yy) : x(xx), y(yy) { }

    void Set(double xx, double yy) {

    x = xx, y = yy;

    }

    // ...

    };

  • i tng l thnh phn ca mng

    14/09/2014 Lp trnh hng i tng 13

    class String {

    char *p;

    public:

    String(char *s) { p = strdup(s); }

    String(const String &s) { p = strdup(s.p); }

    ~String() {

    cout

  • i tng l thnh phn ca mng

    14/09/2014 Lp trnh hng i tng 14

    class SinhVien{

    String MaSo;

    String HoTen;

    int NamSinh;

    public:

    SinhVien(char *ht, char *ms, int ns) : HoTen(ht),

    MaSo(ms), NamSinh(ns){ }

    };

    String arrs[3];

    Diem arrd[5];

    SinhVien arrsv[7]; ?

  • Dng phng thc thit lp vi tham s c gi tr mc nhin

    14/09/2014 Lp trnh hng i tng 15

    class Diem

    {

    double x,y;

    public:

    Diem(double xx = 0, double yy = 0) : x(xx), y(yy) { }

    void Set(double xx, double yy) {

    x = xx, y = yy;

    }

    // ...

    };

  • Dng phng thc thit lp vi tham s c gi tr mc nhin

    14/09/2014 Lp trnh hng i tng 16

    class String{

    char *p;

    public:

    String(char *s = "") { p = strdup(s); }

    String(const String &s) { p = strdup(s.p); }

    ~String() {

    cout

  • Dng phng thc thit lp vi tham s c gi tr mc nhin

    14/09/2014 Lp trnh hng i tng 17

    class SinhVien{

    String MaSo, HoTen;

    int NamSinh;

    public:

    SinhVien(char *ht=Nguyen Van A, char *ms=19920014, int ns = 1982) : HoTen(ht), MaSo(ms), NamSinh(ns) { }

    };

    String as[3];

    Diem ad[5];

    SinhVien asv[7];

    ?

  • Dng phng thc thit lp khng tham s

    14/09/2014 Lp trnh hng i tng 18

    class Diem

    {

    double x,y;

    public:

    Diem(double xx, double yy) : x(xx), y(yy)

    { }

    Diem() : x(0), y(0)

    { }

    // ...

    };

  • Dng phng thc thit lp khng tham s

    14/09/2014 Lp trnh hng i tng 19

    class String{

    char *p;

    public:

    String(char *s) { p = strdup(s); }

    String() { p = strdup(); }

    ~String() {

    cout

  • Dng phng thc thit lp khng tham s

    14/09/2014 Lp trnh hng i tng 20

    class SinhVien {

    String MaSo, HoTen;

    int NamSinh;

    public:

    SinhVien(char *ht, char *ms, int ns) : HoTen(ht),

    MaSo(ms), NamSinh(ns) { }

    SinhVien() : HoTen(Nguyen Van A), MaSo(19920014), NamSinh(1982) { }

    };

    String as[3];

    Diem ad[5];

    SinhVien asv[7];

    ?

  • i tng c cp pht ng

    i tng c cp pht ng l cc i tng

    c to ra bng php ton new v b hy i

    bng php ton delete

    Php ton new cp i tng trong vng heap v

    gi phng thc thit lp cho i tng c

    cp.

    14/09/2014 Lp trnh hng i tng 21

  • i tng c cp pht ng

    14/09/2014 Lp trnh hng i tng 22

    class String {

    char *p;

    public:

    String( char *s ) { p = strdup(s); }

    String( const String &s ) { p = strdup(s.p); }

    ~String() { delete [] p; }

    //...

    };

    class Diem {

    double x,y;

    public:

    Diem(double xx, double yy) : x(xx), y(yy) { }

    //...

    };

  • Cp pht v hy mt i tng

    14/09/2014 Lp trnh hng i tng 23

    int *pi = new int;

    int *pj = new int(15);

    Diem *pd = new Diem(20,40);

    String *pa = new String("Nguyen Van A");

    //...

    delete pa;

    delete pd;

    delete pj;

    delete pi;

  • Cp pht v hy nhiu i tng

    int *pai = new int[10];

    Diem *pad = new Diem[5];

    String *pas = new String[5];

    14/09/2014 Lp trnh hng i tng 24

    ?

    Sai

    Trong trng hp cp pht nhiu i tng, ta

    khng th cung cp tham s cho tng phn t

    c cp pht.

  • Cp v hy nhiu i tng

    Thng bo li cho on chng trnh trn nh

    sau:

    Cannot find default constructor to initialize array

    element of type 'Diem'

    Cannot find default constructor to initialize array

    element of type String

    Khc phc li?

    14/09/2014 Lp trnh hng i tng 25

    Li trn c khc phc bng cch cung cp phng

    thc thit lp i tng c kh nng t khi ng.

  • Cp v hy nhiu i tng

    14/09/2014 Lp trnh hng i tng 26

    class String{

    char *p;

    public:

    String (char *s = "Alibaba") { p = strdup(s); }

    String (const String &s) { p = strdup(s.p); }

    ~String () {delete [] p;}

    //...

    };

    class Diem {

    double x,y;

    public:

    Diem (double xx, double yy) : x(xx),y(yy){};

    Diem () : x(0),y(0){};

    };

  • Cp v hy nhiu i tng

    Khi mi phn t c cp u c khi

    ng vi cng gi tr.

    int *pai = new int[10];

    Diem *pad = new Diem[5];

    //Ca 5 diem co cung toa do (0,0)

    String *pas = new String[5];

    //Ca 5 chuoi cung duoc khoi dong la Alibaba

    14/09/2014 Lp trnh hng i tng 27

  • Cp v hy nhiu i tng

    Vic hy nhiu i tng c thc hin bng

    cch dng delete v c thm du [] trc.

    delete [] pas;

    delete [] pad;

    delete [] pai;

    C th thay ba pht biu trn bng mt pht biu

    duy nht sau hay khng?

    delete pas,pad,pai;

    14/09/2014 Lp trnh hng i tng 28

  • Hm bn, lp bn

    Gi s c lp Vector, lp Matrix

    Cn vit hm nhn Vector vi mt Matrix

    Hm nhn:

    Khng th thuc lp Vector

    Khng th thuc lp Matrix

    Khng th t do

    Gii php: Xy dng hm truy cp d liu?

    14/09/2014 Lp trnh hng i tng 29

  • Hm bn (Friend function)

    Hm bn khng thuc lp. Tuy nhin, c

    quyn truy cp cc thnh vin private.

    Khi nh ngha mt lp, c th khai bo

    mt hay nhiu hm bn (bn ngoi lp)

    u im:

    Kim sot cc truy nhp cp lp khng

    th p t hm bn cho lp nu iu khng

    c d tr trc trong khai bo ca lp. 14/09/2014 Lp trnh hng i tng 30

  • Hm bn (Friend function)

    Cc tnh cht ca quan h friend:

    Phi c cho, khng c nhn

    Lp B l bn ca lp A, lp A phi khai bo r rng

    B l bn ca n

    Khng i xng

    Khng bc cu

    14/09/2014 Lp trnh hng i tng 31

  • V d

    14/09/2014 Lp trnh hng i tng 32

    class COUNTERCLASS{

    int Counter;

    public:

    char CounterChar;

    void Init( char );

    void AddOne( ){

    Counter++;

    }

    friend int Total (int);

    };

  • V d

    14/09/2014 Lp trnh hng i tng 33

    COUNTERCLASS MyCounter[26];

    int Total(int NumberObjects)

    {

    for (int i=0, sum=0; i

  • Lp bn (Friend class)

    Mt lp c th truy cp n cc thnh phn

    c thuc tnh private ca mt lp khc.

    thc hin c iu ny, chng ta c

    th ly ton b mt lp lm bn (hm

    friend) cho lp khc.

    14/09/2014 Lp trnh hng i tng 34

  • V d

    14/09/2014 Lp trnh hng i tng 35

    class TOM{

    public:

    friend class JERRY; //C lp bn l JERRY

    private:

    int SecretTom; //B mt ca TOM

    };

    class JERRY{

    public:

    void Change(TOM T){

    T.SecterTom++; //Bn nn c th thao th }

    };

  • Giao din v chi tit ci t

    Lp c hai phn tch ri

    Phn giao din khai bo trong phn public ngi

    s dng thy v s dng.

    Chi tit ci t bao gm d liu khai bo trong phn

    private ca lp v chi tit m ha cc hm thnh phn,

    v hnh i vi ngi dng.

    Lp ThoiDiem c th c ci t vi cc thnh

    phn d liu l gi, pht, giy hoc tng s giy

    tnh t 0 gi.

    14/09/2014 Lp trnh hng i tng 36

  • Giao din v chi tit ci t

    Ta c th thay i uyn chuyn chi tit ci t,

    ngha l c th thay i t chc d liu ca lp,

    cng nh c th thay i chi tit thc hin cc

    hm thnh phn (do s thay i t chc d liu

    hoc ci tin gii thut). Nhng nu bo m

    khng thay i phn giao din th khng nh

    hng n ngi s dng, v do khng lm

    v kin trc ca h thng.

    14/09/2014 Lp trnh hng i tng 37

  • Lp ThoiDiem Cch 1

    14/09/2014 Lp trnh hng i tng 38

    class ThoiDiem{

    int gio, phut, giay;

    static bool HopLe(int g, int p, int gy);

    public:

    ThoiDiem(int g = 0, int p = 0, int gy = 0) {Set(g,p,gy);}

    void Set(int g, int p, int gy);

    int LayGio() const {return gio; }

    int LayPhut() const {return phut; }

    int LayGiay() const {return giay; }

    void Nhap();

    void Xuat() const;

    void Tang();

    void Giam();

    };

  • Lp ThoiDiem Cch 2

    14/09/2014 Lp trnh hng i tng 39

    class ThoiDiem{

    long tsgiay;

    static bool HopLe(int g, int p, int gy);

    public:

    ThoiDiem(int g = 0, int p = 0, int gy = 0) {Set(g,p,gy);}

    void Set(int g, int p, int gy);

    int LayGio() const {return tsgiay/3600;}

    int LayPhut() const {return (tsgiay%3600)/60;}

    int LayGiay() const {return tsgiay%60;}

    void Nhap();

    void Xuat() const;

    void Tang();

    void Giam();

    };

  • Cc nguyn tc xy dng lp

    Hnh thnh lp: Khi ta ngh n n nh mt

    khi nim ring l Xy dng lp biu din khi

    nim .

    Lp l biu din c th ca mt khi nim v vy

    tn lp lun l danh t.

    Cc thuc tnh ca lp l cc thnh phn d liu

    nn chng lun l danh t.

    Cc hm thnh phn (cc hnh vi) l cc thao tc

    ch r hot ng ca lp nn cc hm l ng t.

    14/09/2014 Lp trnh hng i tng 40

  • Cc nguyn tc xy dng lp

    14/09/2014 Lp trnh hng i tng 41

    Problem

    properties

    Operation

    (function,

    method,

    behavior)

    Program

    class XX

    { type1 prop1;

    type2 prop2;

    .......

    type Method1(...)

    {

    }

    .....

    };

    void main()

    { XX x; // object variable

    x.Method(...);

    }

    pick

    nouns

    pick

    verbs

    Bao gi d liu v hnh vi thnh class

  • Cc nguyn tc xy dng lp

    Cc thuc tnh c th suy din t nhng thuc

    tnh khc th nn dng hm thnh phn thc

    hin tnh ton.

    14/09/2014 Lp trnh hng i tng 42

    class TamGiac{

    Diem A,B,C;

    double ChuVi;

    double DienTich;

    public:

    //...

    };

    class TamGiac{

    Diem A,B,C;

    public:

    //...

    double ChuVi() const;

    double DienTich() const;

    };

  • Cc nguyn tc xy dng lp

    Tuy nhin, nu cc thuc tnh suy din di hi

    nhiu ti nguyn hoc thi gian thc hin tnh

    ton, ta nn khai bo l d liu thnh phn.

    14/09/2014 Lp trnh hng i tng 43

    class QuocGia{

    long DanSo;

    double DienTich;

    double TuoiTrungBinh;

    public:

    double TinhTuoiTB() const;

    //...

    };

  • Cc nguyn tc xy dng lp

    D liu thnh phn nn c kt hp:

    14/09/2014 Lp trnh hng i tng 44

    class TamGiac{

    Diem A,B,C;

    public:

    //...

    };

    class HinhTron{

    Diem Tam;

    double BanKinh;

    public:

    //...

    };

    class TamGiac{

    double xA, yA;

    double xB, yB, xC, yC;

    public:

    //...

    };

    class HinhTron{

    double tx, ty, BanKinh;

    public:

    //...

    };

  • Cc nguyn tc xy dng lp

    Trong mi trng hp, nn c phng thc thit

    lp (Constructor) khi ng i tng.

    Nn c phng thc thit lp c kh nng t

    khi ng khng cn tham s

    14/09/2014 Lp trnh hng i tng 45

  • Cc nguyn tc xy dng lp

    Nu i tng c nhu cu cp pht ti nguyn th

    phi c phng thc thit lp, copy constructor

    khi ng i tng bng i tng cng

    kiu v c destructor dn dp. Ngoi ra cn

    c php gn (chng 5).

    Nu i tng n gin khng cn ti nguyn

    ring Khng cn copy constructor v destructor

    14/09/2014 Lp trnh hng i tng 46

  • Bi tp

    Vit chng trnh cho php nhp, xut, khi to

    1 hc sinh. Thng tin cn quan tm v 1 hc sinh:

    M hc sinh (8 k t), h tn hc sinh (30 k t),

    im ton (int), im vn (int).

    Danh t: Hc sinh cu trc HS

    ng t:

    Nhp mt hs Hm Nhap()

    Xut mt hs Hm Xuat();

    14/09/2014 Lp trnh hng i tng 47

  • Q & A