Tải bản đầy đủ (.ppt) (56 trang)

Giáo án - Bài giảng: ĐỐI TƯỢNG VÀ LỚP TRONG C++

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (3.02 MB, 56 trang )

CHƯƠNG 2:
ĐỐI TƯỢNG VÀ LỚP

Khái niệm về đóng gói dữ liệu

Khai báo và sử dụng một lớp

Khai báo và sử dụng đối tượng, con trỏ đối tượng, tham chiếu đối
tượng

Hàm thiết lập và hàm huỷ bỏ

Khai báo và sử dụng hàm thiết lập sao chép

Vai trò của hàm thiết lập ngầm định
CHƯƠNG 2:
ĐỐI TƯỢNG VÀ LỚP
1. ĐỐI TƯỢNG
Ví dụ mô tả một đối tượng điểm

{
//dữ liệu
int x,y;
//phuong thuc
void init(int ox,int oy);
void move(int dx,int dy);
void display();
};
Đóng gói là cơ chế liên kết các lệnh thao tác và dữ liệu có liên quan giứp cho cả
hai được an toàn tránh sự can thiệp từ bên ngoài và việc sử dụng sai.
Đối tượng = dữ liệu + phương thức


CHƯƠNG 2:
ĐỐI TƯỢNG VÀ LỚP
1. ĐỐI TƯỢNG
-
Lời gọi đến một phương thức là truyền một thông báo đến cho đối tượng
-
Các thông điệp gởi tới đối tượng nào sẽ gắn chặt với đối tượng đó
Trong C++, khi cài đặt đối tượng cho phép che dấu một bộ phận dữ liệu của đối
tượng và mở rộng khả năng truy nhập đến các thành phân riêng của đối
tượng
CHƯƠNG 2:
ĐỐI TƯỢNG VÀ LỚP
2. LỚP
-
Lớp là một mô tả trừu tượng của nhóm của các đối tượng có cùng bản chất
-
Một đối tượng là một thể hiện cụ thể của lớp
2.1 Khai báo lớp
class <tên lớp> {
private:
<khai báo các thành phần riêng trong từng đối tượng>
public:
<khai báo các thành phần công cộng của từng đối tượng>
};
<định nghĩa các hàm thành phần>

CHƯƠNG 2:
ĐỐI TƯỢNG VÀ LỚP
2. LỚP
2.1 Khai báo lớp

/*
/*
point.cpp
point.cpp
*/
*/
#include <iostream.h>
#include <iostream.h>
#include <conio.h>
#include <conio.h>
class point {
class point {


//khai bao cac thanh phan rieng
//khai bao cac thanh phan rieng


private:
private:


int x,y;
int x,y;


//khai bao cac thanh phan cong cong
//khai bao cac thanh phan cong cong



public:
public:


void init(int ox, int oy);
void init(int ox, int oy);


void move(int dx, int dy);
void move(int dx, int dy);


void display();
void display();


};
};
//dinh nghia cac ham thanh phan ben
//dinh nghia cac ham thanh phan ben
ngoai khai bao lop
ngoai khai bao lop
void point::init(int ox, int oy) {
void point::init(int ox, int oy) {


cout<<"Ham thanh phan init\n";
cout<<"Ham thanh phan init\n";



x = ox; y = oy;
x = ox; y = oy;


}
}
void point::move(int dx, int dy) {
void point::move(int dx, int dy) {


cout<<"Ham thanh phan move\n";
cout<<"Ham thanh phan move\n";


x += dx; y += dy;
x += dx; y += dy;


}
}
void point::display() {
void point::display() {


cout<<"Ham thanh phan display\n";
cout<<"Ham thanh phan display\n";


cout<<"Toa do: "<<x<<" "<<y<<"\n";
cout<<"Toa do: "<<x<<" "<<y<<"\n";



}
}
CHƯƠNG 2:
ĐỐI TƯỢNG VÀ LỚP
2. LỚP
2.1 Khai báo lớp
void main() {
void main() {


clrscr();
clrscr();


point p;
point p;


p.init(2,4);
p.init(2,4);
//goi ham thanh phan tu doi
//goi ham thanh phan tu doi
tuong
tuong


p.display();
p.display();



p.move(1,2);
p.move(1,2);


p.display();
p.display();


getch();
getch();


}
}
CHƯƠNG 2:
ĐỐI TƯỢNG VÀ LỚP
2. LỚP
2.1 Khai báo lớp
-
Có thể định nghĩa trực tiếp các hàm thành phần bên trong khai báo lớp
-
Khi định nghĩa hàm thành phần bên ngoài khai báo lớp ta sử dụng cú pháp
<tên kiểu trả về><tên lớp>::<tên hàm>(<danh sách tham số>)
{ <nội dung>}
-
Gọi hàm thành phần từ đối tượng của một lớp chính là truyền thông điệp cho hàm hàm
thành phần đó, cú pháp
<tên đối tượng>.<tên hàm thành phần>(<danh sách các tham số nếu có>)

CHƯƠNG 2:
ĐỐI TƯỢNG VÀ LỚP
2. LỚP
2.1.1 Tạo đối tượng
Tạo đối tượng
<tên lớp> <tên đối tượng>;
2.1.2 Các thành phần dữ liệu
Khai báo các thành phần dữ liệu giống khai báo biến
<tên biến> <tên thành phần>;
Khung DL
Phương thức
Dữ liệu cụ thể 1
Tham chiếu phương thức
Dữ liệu cụ thể2
Tham chiếu phương thức
Lớp
Đối tượng Đối tượng
Đối tượng là một thể hiện của lớp
CHƯƠNG 2:
ĐỐI TƯỢNG VÀ LỚP
2. LỚP
2.1.3 Các hàm thành phần
#include <iostream.h>
#include <iostream.h>
#include <conio.h>
#include <conio.h>
class point {
class point {



private:
private:


int x,y;
int x,y;


public:
public:


//dinh nghia ham thanh phan ben trong khai
//dinh nghia ham thanh phan ben trong khai
bao lop
bao lop


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


cout<<"Ham thanh phan init\n";
cout<<"Ham thanh phan init\n";


x = ox; y = oy;
x = ox; y = oy;
}
}



void move(int dx, int dy);
void move(int dx, int dy);


void display();
void display();


};
};
// dinh nghia cac ham thanh phan ben ngoai
// dinh nghia cac ham thanh phan ben ngoai
khai bao lop
khai bao lop
void point::move(int dx, int dy) {
void point::move(int dx, int dy) {


cout<<"Ham thanh phan move\n";
cout<<"Ham thanh phan move\n";


x += dx; y += dy;
x += dx; y += dy;


}
}

void point::display() {
void point::display() {


cout<<"Ham thanh phan display\n";
cout<<"Ham thanh phan display\n";


cout<<"Toa do: "<<x<<" "<<y<<"\n";
cout<<"Toa do: "<<x<<" "<<y<<"\n";


}
}
CHƯƠNG 2:
ĐỐI TƯỢNG VÀ LỚP
2. LỚP
2.1.3 Các hàm thành phần

void main() {
void main() {


clrscr();/
clrscr();/


point p;
point p;



p.init(2,4);
p.init(2,4);
//goi ham thanh phan tu doi
//goi ham thanh phan tu doi
tuong
tuong


p.display();
p.display();


p.move(1,2);
p.move(1,2);


p.display();
p.display();


getch();
getch();


}
}
CHƯƠNG 2:
ĐỐI TƯỢNG VÀ LỚP
2. LỚP

2.1.3 Các hàm thành phần
Có thể đặt định hàm thành phần trong cùng tập tin khai báo lớp hoặc trong một tập tin khác
Ví dụ tệp tiêu đề point.h
Ví dụ tệp tiêu đề point.h
#ifndef
#ifndef


point_h
point_h
#define point_h
#define point_h
#include <iostream.h>
#include <iostream.h>
class point {
class point {


//khai bao thanh phan du lieu rieng
//khai bao thanh phan du lieu rieng


private:
private:


int x,y;
int x,y;



//Khai bao cac ham cong cong
//Khai bao cac ham cong cong


public:
public:


void init(int ox, int oy);
void init(int ox, int oy);


void move(int dx, int dy);
void move(int dx, int dy);


void display();
void display();


};
};
#endif
#endif
CHƯƠNG 2:
ĐỐI TƯỢNG VÀ LỚP
2. LỚP
2.1.3 Các hàm thành phần
Có thể đặt định hàm thành phần trong cùng tập tin khai báo lớp hoặc trong một tập tin khác
Ví dụ tệp chương trình nguồn

Ví dụ tệp chương trình nguồn
#include “point.h”
#include “point.h”
#include <conio.h>
#include <conio.h>
//Dinh nghia cac ham thanh phan
//Dinh nghia cac ham thanh phan
void point::init(int ox, int oy) {
void point::init(int ox, int oy) {


cout<<"Ham thanh phan init\n";
cout<<"Ham thanh phan init\n";


x = ox; y = oy;
x = ox; y = oy;
}
}
void point::move(int dx, int dy) {
void point::move(int dx, int dy) {


cout<<"Ham thanh phan move\n";
cout<<"Ham thanh phan move\n";


x += dx; y += dy;
x += dx; y += dy;



}
}
void point::display() {
void point::display() {


cout<<"Ham thanh phan display\n";
cout<<"Ham thanh phan display\n";


cout<<"Toa do: "<<x<<" "<<y<<"\n";
cout<<"Toa do: "<<x<<" "<<y<<"\n";


}
}
void main() {
void main() {


clrscr();
clrscr();


point p;
point p;


p.init(2,4);

p.init(2,4);


p.display();
p.display();


p.move(1,2);
p.move(1,2);


p.display();
p.display();


getch();
getch();


}
}
CHƯƠNG 2:
ĐỐI TƯỢNG VÀ LỚP
2. LỚP
2.1.4 Phạm vi lớp
Tất cả các thành phần của lớp sẽ được coi là thuộc phạm vi lớp, trong định nghĩa hàm
thành phần của lớp có thể tham khảo đến bất kỳ một thành phần nào khác của lớp đó
2.1.5 Từ khoá xác định phạm vi lớp
-
Những thành phần được liệt kê trong phần private chỉ được truy xuất bên trong phạm

vi lớp
-
Những thành phần được liệu kê trong phần public có thể truy xuất từ bên ngoài vào
CHƯƠNG 2:
ĐỐI TƯỢNG VÀ LỚP
2. LỚP
2.1.5 Từ khoá xác định phạm vi lớp
-
Khi khai báo nên sắp xếp các thành phần private lên trên, các thành phần public ở phía
dưới
-
Khi khai báo có thể bỏ nhãn private đi vì C++ hiểu rằng các thành phần nằm trước
public là private
CHƯƠNG 2:
ĐỐI TƯỢNG VÀ LỚP
2. LỚP
Lưu ý:
-
Nếu tất cả các thành phần của lớp là public, lớp sẽ tương đương với struct
-
Ngoài public và private, còn có từ khoá protected, trong phạm vì lớp hiện tại một thành
phần protected có tính chất giống như thành phần private
CHƯƠNG 2:
ĐỐI TƯỢNG VÀ LỚP
2. LỚP
2.2 Khả năng của các hàm thành phần
2.2.1 Định nghĩa chồng các hàm thành phần
Các hàm thành phần có thể trùng tên nhưng phải khác nhau kiểu giá trị trả về, danh sách
kiểu các tham số
/*point3.cpp*/

/*point3.cpp*/
#include <iostream.h>
#include <iostream.h>
#include <conio.h>
#include <conio.h>
class point {
class point {
int x,y;
int x,y;


public:
public:


//dinh nghia chong ham thanh phan
//dinh nghia chong ham thanh phan
void init();
void init();
void init (int);
void init (int);
void init (int,int);
void init (int,int);
void display();
void display();
void display(char *);
void display(char *);


};

};
void point::init() {
void point::init() {


x=y=0;
x=y=0;


}
}
void point::init(int abs) {
void point::init(int abs) {


x=abs;y=0;
x=abs;y=0;


}
}
void point::int(int abs,int ord) {
void point::int(int abs,int ord) {


x=abs;
x=abs;


y=ord;

y=ord;


}
}
CHƯƠNG 2:
ĐỐI TƯỢNG VÀ LỚP
2. LỚP
2.2 Khả năng của các hàm thành phần
2.2.1 Định nghĩa chồng các hàm thành phần
void main() {
void main() {


clrscr();
clrscr();


point a;
point a;


a.init();
a.init();
//point::init()
//point::init()


a.display();//point::display()
a.display();//point::display()



point b; b.init(5);
point b; b.init(5);
//point::init(int )
//point::init(int )


b.display("point b - ");
b.display("point b - ");
//point::display(char *)
//point::display(char *)


point c; c.init(3,12);
point c; c.init(3,12);
//point::init(int, int)
//point::init(int, int)


c.display("Hello ");
c.display("Hello ");


getch();
getch();


}
}

CHƯƠNG 2:
ĐỐI TƯỢNG VÀ LỚP
2. LỚP
2.2 Khả năng của các hàm thành phần
2.2.2 Các tham số với giá trị ngầm định
#include <iostream.h>
#include <iostream.h>
#include <conio.h>
#include <conio.h>
class point {
class point {
int x,y;
int x,y;


public:
public:
void init (int=0,int=0);
void init (int=0,int=0);
void display(char *=””);
void display(char *=””);


};
};
void point::int(int abs,int ord) {
void point::int(int abs,int ord) {


x=abs;

x=abs;


y=ord;
y=ord;


}
}
void point::display(char *mesg) {
void point::display(char *mesg) {


cout<<mesg;
cout<<mesg;


display();
display();


}
}
void main() {
void main() {


clrscr();
clrscr();



point a;
point a;


a.init();
a.init();
//a.init(0,0)
//a.init(0,0)


a.display();
a.display();
//a.display(“”);
//a.display(“”);


point b;
point b;


b.init(5);
b.init(5);
//b.init(5,0)
//b.init(5,0)


b.display("point b - ");
b.display("point b - ");



point c;
point c;


c.init(3,12);
c.init(3,12);
//c.init(3,12)
//c.init(3,12)


c.display("Hello ");
c.display("Hello ");


getch();
getch();


}
}
CHƯƠNG 2:
ĐỐI TƯỢNG VÀ LỚP
2. LỚP
2.2 Khả năng của các hàm thành phần
2.2.3 Sử dụng đối tượng làm tham số của hàm thành phần
-
Hàm thành phần có quyền truy xuất tới thành phần private của các đối tượng, tham chiếu đối
tượng hay con trỏ đối tượng có cùng kiểu lớp khi được dùng là tham số hình thức
class point {

class point {


int x,y;
int x,y;


public:
public:




//truyen bang tri
//truyen bang tri


int coincide(point pt)
int coincide(point pt)


{return(x==pt.x && y==pt.y);}
{return(x==pt.x && y==pt.y);}
// truyen bang tham chieu
// truyen bang tham chieu


int coincide(point *pt)
int coincide(point *pt)



{return(x==pt->x && y==pt->y);}
{return(x==pt->x && y==pt->y);}
//truyen bang con tro
//truyen bang con tro


int coincide(point &pt)
int coincide(point &pt)


{return(x==pt.x && y==pt.y);}
{return(x==pt.x && y==pt.y);}
} }
} }
CHƯƠNG 2:
ĐỐI TƯỢNG VÀ LỚP
2. LỚP
2.2 Khả năng của các hàm thành phần
2.2.4 Con trỏ this
-
Con trỏ this tham chiếu đến đối tượng đang gọi hàm thành phần -> có thể truy xuất đến các thành
phần của đối tượng gọi hàm thành phần gián tiếp thông qua this
Ví dụ:
Ví dụ:
int point::coincide(point pt)
int point::coincide(point pt)


{return(this->x==pt.x && this->y==pt.y);}

{return(this->x==pt.x && this->y==pt.y);}
void point::display()
void point::display()


{
{


cout<<"Dia chi : "<<this<<"Toa do : "<<x<<"
cout<<"Dia chi : "<<this<<"Toa do : "<<x<<"
"<<y<<"\n";
"<<y<<"\n";
}
}
CHƯƠNG 2:
ĐỐI TƯỢNG VÀ LỚP
3. PHÉP GÁN ĐỐI TƯỢNG
-
Có thể gán 2 đối tượng cùng kiểu
Ví dụ:
point a, b;
a.init(5,2);
b=a;
2 y
5
b
a
x
5

2
x
y
CHƯƠNG 2:
ĐỐI TƯỢNG VÀ LỚP
3. PHÉP GÁN ĐỐI TƯỢNG
-
Khi các đối tượng có chứa thành phần dữ liệu động
2
y
5
b
a
5
2
Vùng dữ liệu động
z
z
x
y
x
CHƯƠNG 2:
ĐỐI TƯỢNG VÀ LỚP
Ví dụ xây dựng lớp
-
Xây dựng lớp nhân viên có các thuộc tính sau: Tên, năm sinh, điạ chỉ,
số điện thoại, email, ngày vào làm việc, hệ số lương, số ngày nghỉ
-
Các phương thức đối với nhân viên: tăng hệ số lương, đổi số điện
thoại, xin nghỉ phép.

-
Thực hiện quản lý một công ty có 10 nhân viên.
-
In ra danh sách tên, năm sinh và địa chỉ các nhân viên trong công ty.
-

CHƯƠNG 2:
ĐỐI TƯỢNG VÀ LỚP
4. HÀM THIẾT LẬP VÀ HÀM HUỶ BỎ
4.1 Hàm thiết lập
-
Là một hàm đặc biệt trong lớp và nó được gọi tự động khi có một đối tượng được khai
báo.
-
Hàm thiết lập khởi tạo các giá trị thành phần dữ liệu của đối tượng, xin cấp phát bộ
nhớ cho các thành phần dữ liệu động
CHƯƠNG 2:
ĐỐI TƯỢNG VÀ LỚP
4. HÀM THIẾT LẬP VÀ HÀM HUỶ BỎ
4.1 Hàm thiết lập
#include <iostream.h>
#include <iostream.h>
#include <conio.h>
#include <conio.h>
class point
class point
{
{



//
//


int x;
int x;


int y;
int y;
public:
public:


//
//


point(int ox,int oy) {x=ox;y=oy;}
point(int ox,int oy) {x=ox;y=oy;}
//ham thiet lap
//ham thiet lap


void move(int dx,int dy) ;
void move(int dx,int dy) ;


void display();
void display();



};
};
void point::move(int dx,int dy){
void point::move(int dx,int dy){


x+=dx;
x+=dx;


y+=dy;
y+=dy;


}
}
void point::display(){
void point::display(){


cout<<“Toa do : “<<x<<" "<<y<<"\n";
cout<<“Toa do : “<<x<<" "<<y<<"\n";


}
}
void main() {
void main() {

clrscr();
clrscr();
point a(5,2);
point a(5,2);
//ham thiet lap
//ham thiet lap
a.display();
a.display();
a.move(-2,4);
a.move(-2,4);
a.display();
a.display();
point b.init(1,-1);
point b.init(1,-1);
b.display();
b.display();
}
}

×