62
CHƯƠNG 3. LỚP VÀ ĐỐI TƯỢNG ThS. Trần Anh Dũng

Chuong 03 - Lop Va Doi Tuong

Embed Size (px)

Citation preview

  • CHNG 3. LP V I TNG

    ThS. Trn Anh Dng

  • Ni dung

    C php khai bo lp

    nh ngha hm thnh phn ca lp

    Khai bo v to lp i tng

    Phm vi truy xut

    Phng thc thit lp Constructor

    Phng thc hy b Destructor

    Phng thc Truy vn, Cp nht

    Thnh vin tnh static member

    14/09/2014 Lp trnh hng i tng 2

  • Lp trong C++

    Mt lp bao gm cc thnh phn d liu (thuc

    tnh) v cc phng thc (hm thnh phn).

    Lp trong C++ thc cht l mt kiu d liu do

    ngi s dng nh ngha.

    Trong C++, dng t kha class ch im bt

    u ca mt lp s c ci t.

    14/09/2014 Lp trnh hng i tng 3

  • Lp i tng

    Lp l mt m t tru tng ca nhm cc i

    tng cng bn cht, ngc li mi mt i

    tng l mt th hin c th cho nhng m t

    tru tng .

    14/09/2014 Lp trnh hng i tng 4

  • C php khai bo lp

    class

    {

    //Thnh phn d liu

    //Thnh phn x l

    };

    14/09/2014 Lp trnh hng i tng 5

  • C php khai bo lp

    class {

    private:

    protected:

    public:

    }; 14/09/2014 Lp trnh hng i tng 6

  • C php khai bo lp

    14/09/2014 Lp trnh hng i tng 7

    class class_name

    {

    Access_Control_label:

    members; (data & code)

    Access_Control_label :

    members; (data & code)

    };

    class Rectangle

    {

    private:

    int width;

    int length;

    public:

    void set(int w, int l);

    int area();

    };

    Header

  • Cc thnh phn ca lp

    Thuc tnh: Cc thuc tnh c khai bo

    ging nh khai bo bin trong C

    Phng thc: Cc phng thc c khai

    bo ging nh khai bo hm trong C. C

    hai cch nh ngha thi hnh ca mt

    phng thc

    nh ngha thi hnh trong lp

    nh ngha thi hnh ngoi lp

    14/09/2014 Lp trnh hng i tng 8

  • C ch to lp cc lp

    Xc nh cc thuc tnh (d liu)

    Nhng g m ta bit v i tng ging nh

    mt struct

    Xc nh cc phng thc (hnh vi)

    Nhng g m i tng c th lm

    Xc nh cc quyn truy xut

    14/09/2014 Lp trnh hng i tng 9

  • nh ngha hm thnh phn

    C php nh ngha cc hm thnh phn

    bn ngoi khai bo lp:

    :: ()

    {

    }

    V d:

    void point::display() {

    //..

    }

    14/09/2014 Lp trnh hng i tng 10

  • nh ngha hm thnh phn

    14/09/2014 Lp trnh hng i tng 11

    class Rectangle{

    private:

    int width, length;

    public:

    void set (int w, int l);

    int area() { return width*length; }

    };

    void Rectangle :: set (int w, int l)

    {

    width = w;

    length = l;

    }

    inline

    class name

    member function name

    scope operator

  • V d lp Time

    14/09/2014 Lp trnh hng i tng 12

    class Time {

    public:

    void Set (int hours , int minutes , int seconds);

    void Increment ( );

    void Write ( ) const;

    Time (int initHrs, int initMins, int initSecs ); //constructor

    Time ( ); //default constructor

    private: int hrs; int mins; int secs;

    } ;

  • V d lp Time

    14/09/2014 Lp trnh hng i tng 13

    Private data:

    hrs

    mins

    secs

    Set

    Increment

    Write

    Time

    Time

    Time class

  • Khai bo v to lp i tng

    Khai bo v to i tng:

    ;

    Gi hm thnh phn ca lp

    . ();

    ();

    14/09/2014 Lp trnh hng i tng 14

  • Khai bo v to lp i tng

    14/09/2014 Lp trnh hng i tng 15

    class Rectangle

    {

    private:

    int width;

    int length;

    public:

    void set(int w, int l);

    int area();

    };

    void main()

    {

    Rectangle r1;

    r1.set(5, 8);

    }

    r1 is statically allocated

    width

    length

    r1 width = 5

    length = 8

  • Khai bo v to lp i tng

    14/09/2014 Lp trnh hng i tng 16

    class Rectangle

    {

    private:

    int width;

    int length;

    public:

    void set(int w, int l);

    int area();

    };

    main()

    {

    Rectangle r1;

    r1.set(5, 8);

    Rectangle *r2; r2 = &r1;

    r2->set(8,10);

    }

    r2 is a pointer to a Rectangle object

    width

    length

    r1 width = 5

    length = 8

    5000

    ???

    r2 6000

    5000

    width = 8

    length = 10

    //dot notation

    //arrow notation

  • Khai bo v to lp i tng

    14/09/2014 Lp trnh hng i tng 17

    class Rectangle

    {

    private:

    int width;

    int length;

    public:

    void set(int w, int l);

    int area();

    };

    main()

    {

    Rectangle *r3; r3 = new Rectangle();

    r3->set(80,100);

    delete r3; r3 = NULL;

    }

    r3 is dynamically allocated

    ???

    r3 6000

    NULL

    //arrow notation

  • V d

    Xy dng lp im (Point) trong hnh hc 2D

    Thuc tnh

    Tung

    Honh

    Thao tc (phng thc)

    Khi to

    Di chuyn

    In ra mn hnh

    14/09/2014 Lp trnh hng i tng 18

  • V d

    14/09/2014 Lp trnh hng i tng 19

    /*point.cpp*/

    #include

    using namespace std;

    class point {

    /*khai bo cc thnh phn d liu ring*/

    private:

    int x,y;

    /*khai bo cc hm thnh phn cng cng*/

    public:

    void init(int ox, int oy);

    void move(int dx, int dy);

    void display();

    };

  • V d

    14/09/2014 Lp trnh hng i tng 20

    void point::init(int ox, int oy) {

    cout

  • V d

    14/09/2014 Lp trnh hng i tng 21

    void main()

    {

    point p;

    p.init(2,4); /*gi hm thnh phn t i tng*/

    p.display();

    p.move(1,2);

    p.display();

    }

    Ham thanh phan init

    Ham thanh phan display

    Toa do: 2 4

    Ham thanh phan move

    Ham thanh phan display

    Toa do: 3 6

  • Phm vi truy xut

    Trong nh ngha ca lp ta c th xc nh kh

    nng truy xut thnh phn ca mt lp no t

    bn ngoi phm vi lp.

    private, protected v public l cc t kha xc

    nh phm vi truy xut

    Mi thnh phn c lit k trong phn public

    u c th truy xut trong bt k hm no.

    Nhng thnh phn c lit k trong phn

    private ch c truy xut bn trong phm vi lp.

    14/09/2014 Lp trnh hng i tng 22

  • Phm vi truy xut

    Trong lp c th c nhiu nhn private v public

    Mi nhn ny c phm vi nh hng cho n khi

    gp mt nhn k tip hoc ht khai bo lp.

    Nhn private u tin c th b qua v C++ ngm

    hiu rng cc thnh phn trc nhn public u

    tin l private.

    14/09/2014 Lp trnh hng i tng 23

  • Phm vi truy xut V d

    14/09/2014 Lp trnh hng i tng 24

    class TamGiac{

    private:

    float a,b,c;/* di ba cnh*/

    public:

    void Nhap();/*nhp vo di ba cnh*/

    void In();/*in ra cc thng tin lin quan n tam gic*/

    private:

    int Loaitg();//cho bit kiu ca tam gic: 1-d,2-vc,3-c,4-v,5-t

    float DienTich();/*tnh din tch ca tam gic*/

    };

  • Phm vi truy xut V d

    14/09/2014 Lp trnh hng i tng 25

    class TamGiac{

    private:

    float a,b,c;/* di ba cnh*/

    int Loaitg();//cho bit kiu ca tam gic: 1-d,2-vc,3-c,4-

    v,5-t

    float DienTich();/*tnh din tch ca tam gic*/

    public:

    void Nhap();/*nhp vo di ba cnh*/

    void In();/*in ra cc thng tin lin quan n tam gic*/

    };

  • Tham s hm thnh phn

    Hm thnh phn c quyn truy nhp n cc

    thnh phn private ca i tng gi n

    14/09/2014 Lp trnh hng i tng 26

    void point::init (int xx, int yy){

    x = xx;

    y = yy; //x, y la thanh phan cua lop point

    }

    ?

  • Tham s hm thnh phn

    14/09/2014 Lp trnh hng i tng 27

    int Trung (point pt){

    return (x==pt.x && y==pt.y);

    }

    int Trung (point *pt){

    return (x==ptx && y==pty);

    }

    int Trung (point &pt) {

    return (x==pt.x && y==pt.y);

    }

    ? Hm thnh phn c quyn truy cp n tt c

    cc thnh phn private ca cc i tng, tham

    chiu i tng hay con tr i tng c cng

    kiu lp khi c dng l tham s hnh thc ca

    n.

  • Con tr this

    T kha this trong nh ngha ca cc hm thnh

    phn lp dng xc nh a ch ca i tng

    dng lm tham s ngm nh cho hm thnh

    phn.

    Con tr this tham chiu n i tng ang gi

    hm thnh phn.

    V d:

    int Trung(point pt){

    return (this x == pt.x && this y == pt.y);

    } 14/09/2014 Lp trnh hng i tng 28

  • Php gn i tng

    L vic sao chp gi tr cc thnh phn d

    liu t i tng a sang i tng b tng

    ng tng i mt

    V d:

    point a, b;

    a.init(5,2);

    b = a;

    14/09/2014 Lp trnh hng i tng 29

    2 y

    5

    b a

    x 5

    2

    x

    y

  • Phng thc thip lp

    Trong hu ht cc thut gii, gii quyt

    mt vn thng phi thc hin cc

    cng vic:

    Khi to gi tr cho bin, cp pht vng b nh

    ca bin con tr, m tp tin truy cp,

    Hoc khi kt thc, chng ta phi thc hin qu

    trnh ngc li nh: Thu hi vng b nh

    cp pht, ng tp tin,

    14/09/2014 Lp trnh hng i tng 30

  • Phng thc thip lp

    Cc ngn ng OOP c cc phng thc

    thc hin cng vic ny mt cch t

    ng gi l phng thc thit lp v

    phng thc hy b.

    14/09/2014 Lp trnh hng i tng 31

  • Phng thc thip lp

    Phng thc thit lp hay cn gi l constructor,

    l mt loi phng thc c bit dng khi

    to th hin ca lp.

    Bt k mt i tng no c khai bo u

    phi s dng mt hm thit lp khi to cc

    gi tr thnh phn ca i tng.

    Hm thit lp c khai bo ging nh mt

    phng thc vi tn phng thc trng vi tn

    lp v khng c gi tr tr v (k c void).

    Constructor phi c thuc tnh public

    14/09/2014 Lp trnh hng i tng 32

  • Phng thc thip lp

    Constructor c th c khai bo chng nh cc

    hm C++ thng thng khc hay khng?

    Constructor c th c khai bo vi cc tham

    s c gi tr ngm nh hay khng?

    14/09/2014 Lp trnh hng i tng 33

  • V d

    14/09/2014 Lp trnh hng i tng 34

    class point{

    /*Khai bo cc thnh phn d liu*/

    int x, y;

    public:

    point() { x = 0; y = 0; } /*Hm thit lp mc nh*/

    point(int ox, int oy) { x = ox; y = oy; }/*Hm thit lp*/

    void move (int dx, int dy);

    void display();

    };

    point a(5,2);

    point b;

    point c(3); ?

  • V d

    14/09/2014 Lp trnh hng i tng 35

    class point{

    /*Khai bo cc thnh phn d liu*/

    int x, y;

    public:

    point() { x = 0; y = 0; } /*Hm thit lp mc nh*/

    point(int ox, int oy = 1){ x = ox; y = oy;}/*Hm thit lp*/

    void move (int dx, int dy);

    void display();

    };

    point a(5,2);

    point b;

    point c(3);

  • Phng thc thip lp mc nh

    Constructor mc nh (default constructor) l

    constructor c gi khi th hin c khai bo

    m khng c i s no c cung cp

    MyClass x;

    MyClass* p = new MyClass;

    Ngc li, nu tham s c cung cp ti khai

    bo th hin, trnh bin dch s gi constructor

    khc (overload)

    MyClass x(5);

    MyClass* p = new MyClass(5);

    14/09/2014 Lp trnh hng i tng 36

  • Phng thc thip lp mc nh

    i vi constructor mc nh, nu ta khng cung

    cp bt k constructor no, C++ s t sinh

    constructor mc nh l mt phng thc rng.

    Tuy nhin, nu ta khng nh ngha constructor

    mc nh nhng li c cc constructor khc, trnh

    bin dch s bo li khng tm thy constructor

    mc nh nu ta khng cung cp tham s khi to

    th hin.

    14/09/2014 Lp trnh hng i tng 37

  • V d

    14/09/2014 Lp trnh hng i tng 38

    class point{

    /*Khai bo cc thnh phn d liu*/

    int x, y;

    public:

    point(int ox, int oy = 1){ x = ox; y = oy;}

    void move (int dx, int dy);

    void display();

    };

    point a(5,2);

    point b;

    point c(3);

  • Phng thc thip lp sao chp

    Chng ta c th to i tng mi ging i

    tng c mt s c im, khng phi hon ton

    nh php gn bnh thng, hnh thc ging

    nhau c nh ngha theo quan nim ca

    ngi lp trnh. lm c vn ny, trong

    cc ngn ng OOP cho php ta xy dng

    phng thc thit lp sao chp.

    y l phng thc thit lp c tham s l tham

    chiu n i tng thuc chnh lp ny.

    14/09/2014 Lp trnh hng i tng 39

  • Phng thc thip lp mc nh

    14/09/2014 Lp trnh hng i tng 40

    Trong phng thc thit lp sao chp c th ta

    ch s dng mt s thnh phn no ca i

    tng ta tham chiu gn ging nhau

  • Phng thc hy b

    Phng thc hy b hay cn gi l destructor,

    c gi ngay trc khi mt i tng b thu hi.

    Destructor thng c dng thc hin vic

    dn dp cn thit trc khi mt i tng b hy.

    14/09/2014 Lp trnh hng i tng 41

  • Phng thc hy b

    Mt lp ch c duy nht mt Destructor

    C php:

    Phng thc Destructor c tn trng tn vi

    tn lp v c du ~ t trc

    Khng c gi tr tr v

    c t ng gi thc hin khi i tng ht

    phm vi s dng.

    Destructor phi c thuc tnh public

    14/09/2014 Lp trnh hng i tng 42

  • V d

    14/09/2014 Lp trnh hng i tng 43

    class vector{

    int n; //s chiu

    float *v; //vng nh ta

    public:

    vector(); //Hm thit lp khng tham s

    vector(int size); //Hm thit lp mt tham s

    vector(int size, float *a);

    ~vector(); //Hm hy b, lun lun khng c tham s

    void display();

    };

  • Thao tc vi d liu private

    Khi mun truy xut d liu private t cc i

    tng th phi lm th no?

    Khi mun cp nht d liu private t cc i

    tng th phi lm th no?

    14/09/2014 Lp trnh hng i tng 44

  • Phng thc Truy vn

    C nhiu loi cu hi truy vn c th:

    Truy vn n gin (gi tr ca x l bao nhiu?)

    Truy vn iu kin (thnh vin x c > 10 khng?)

    Truy vn dn xut (tng gi tr ca cc thnh vin x v

    y l bao nhiu?)

    c im quan trng ca phng thc truy vn

    l n khng nn thay i trng thi hin ti ca

    i tng

    14/09/2014 Lp trnh hng i tng 45

  • Phng thc Truy vn

    i vi cc truy vn n gin, quy c t tn

    phng thc nh sau: Tin t get, tip theo l

    tn ca thnh vin cn truy vn

    int getX();

    int getSize();

    Cc loi truy vn khc nn c tn c tnh m t

    Truy vn iu kin nn c tin t is

    14/09/2014 Lp trnh hng i tng 46

  • Phng thc Cp nht

    Thng thay i trng thi ca i tng

    bng cch sa i mt hoc nhiu thnh vin d

    liu ca i tng .

    Dng n gin nht l gn mt gi tr no cho

    mt thnh vin d liu.

    i vi dng cp nht n gin, quy c t tn

    nh sau: Dng tin t set km theo tn thnh

    vin cn sa

    int setX(int); 14/09/2014 Lp trnh hng i tng 47

  • Truy vn v Cp nht

    Nu phng thc get/set ch c nhim v cho ta

    c/ghi gi tr cho cc thnh vin d liu Quy

    nh cc thnh vin private c ch li g?

    Ngoi vic bo v cc nguyn tc ng gi, ta cn

    kim tra xem gi tr mi cho thnh vin d liu c hp

    l hay khng.

    S dng phng thc truy vn cho php ta thc hin

    vic kim tra trc khi thc s thay i gi tr ca

    thnh vin.

    Ch cho php cc d liu c th truy vn hay thay i

    mi c truy cp n.

    14/09/2014 Lp trnh hng i tng 48

  • V d

    14/09/2014 Lp trnh hng i tng 49

    int Student::setGPA (double newGPA){

    if ((newGPA >= 0.0) && (newGPA gpa = newGPA;

    return 0; // Return 0 to indicate success

    }

    else

    {

    return -1; // Return -1 to indicate failure

    }

    }

  • Thnh vin tnh static member

    Trong C, static xut hin trc d liu c khai

    bo trong mt hm no th gi tr ca d liu

    vn c lu li nh mt bin ton cc.

    Trong C++, nu static xut hin trc mt d liu

    hoc mt phng thc ca lp th gi tr ca n

    vn c lu li v c ngha cho i tng

    khc ca cng lp ny.

    Cc thnh vin static c th l public, private

    hoc protected.

    14/09/2014 Lp trnh hng i tng 50

  • Thnh vin tnh static member

    i vi class, static dng khai bo thnh vin

    d liu dng chung cho mi th hin ca lp:

    Mt bn duy nht tn ti trong sut qu trnh

    chy ca chng trnh.

    Dng chung cho tt c cc th hin ca lp.

    Bt k lp c bao nhiu th hin.

    14/09/2014 Lp trnh hng i tng 51

  • V d

    14/09/2014 Lp trnh hng i tng 52

    class Rectangle

    {

    private:

    int width;

    int length;

    static int count;

    public:

    void set(int w, int l);

    int area();

    }

    Rectangle r1; Rectangle r2; Rectangle r3;

    width

    length

    width

    length

    width

    length

    r1

    r3

    r2

    count

  • V d

    m s i tng MyClass:

    14/09/2014 Lp trnh hng i tng 53

    class MyClass{

    public:

    MyClass();

    ~MyClass();

    void printCount();

    private:

    static int count;

    };

  • V d

    14/09/2014 Lp trnh hng i tng 54

    int MyClass::count = 0;

    MyClass::MyClass(){

    this count++;

    }

    MyClass::~MyClass(){

    this count--;

    }

    void MyClass::printCount(){

    cout

  • V d

    14/09/2014 Lp trnh hng i tng 55

    void main()

    {

    MyClass* x = new MyClass;

    x printCount();

    MyClass* y = new MyClass;

    x printCount();

    y printCount();

    delete x;

    y printCount();

    }

  • Thnh vin tnh static member

    Phng thc static?

    i vi cc phng thc static, ngoi ngha

    tng t vi d liu, cn c s khc bit c

    bn l vic cho php truy cp n cc

    phng thc static khi cha khai bo i

    tng (thng qua tn lp)

    14/09/2014 Lp trnh hng i tng 56

  • Thnh vin tnh static member

    Cc thnh vin lp tnh public c th c truy

    cp thng qua bt k i tng no ca lp ,

    hoc chng c th c truy cp thng qua tn

    lp s dng ton t nh phm vi.

    Cc thnh vin lp tnh private v protected phi

    c truy cp thng qua cc hm thnh vin

    public ca lp hoc thng qua cc friend ca lp.

    Cc thnh vin lp tnh tn ti ngay c khi i

    tng ca lp khng tn ti.

    14/09/2014 Lp trnh hng i tng 57

  • Thnh vin tnh static member

    truy cp mt thnh vin lp tnh public khi cc

    i tng ca lp khng tn ti, n gin thm

    vo u tn lp v ton t nh phm vi cho

    thnh vin d liu.

    truy cp mt thnh vin lp tnh private hoc

    protected khi cc i tng ca lp khng tn ti,

    mt hm thnh vin public phi c cung cp

    v hm phi c gi bi thm vo u tn ca

    n vi tn lp v ton t nh phm vi.

    14/09/2014 Lp trnh hng i tng 58

  • V d v i tng ton cc

    Xt on chng trnh sau:

    #include

    void main(){

    cout

  • V d v i tng ton cc

    14/09/2014 Lp trnh hng i tng 60

    #include

    class Dummy{

    public:

    Dummy(){cout

  • 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 61

  • Q & A