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
Trang 1 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
Trang 2Ví 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);
Trang 3- 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
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
Trang 42 LỚP
Trang 5void init(int ox, int oy);
void move(int dx, int dy);
x += dx; y += dy;
} void point::display() { cout<<"Ham thanh phan display\n"; cout<<"Toa do: "<<x<<" "<<y<<"\n"; }
Trang 72.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ố>)
Trang 82.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 DLPhương thức
Đối tượng Đối tượng
Đối tượng là một thể hiện của lớp
Trang 9void init(int ox, int oy){
cout<<"Ham thanh phan init\n";
cout<<"Toa do: "<<x<<" "<<y<<"\n";
}
Trang 11void init(int ox, int oy);
void move(int dx, int dy);
void display();
};
#endif
Trang 12//Dinh nghia cac ham thanh phan
void point::init(int ox, int oy) {
cout<<"Ham thanh phan init\n";
x = ox; y = oy; }
void point::move(int dx, int dy) {
cout<<"Ham thanh phan move\n";
x += dx; y += dy;
}
void point::display() { cout<<"Ham thanh phan display\n";
cout<<"Toa do: "<<x<<" "<<y<<"\n";
}void main() { clrscr();
Trang 15Lư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
Trang 16void init (int);
void init (int,int);
void display();
void display(char *);
};
void point::init() { x=y=0;
} void point::init(int abs) { x=abs;y=0;
} void point::int(int abs,int ord) { x=abs;
y=ord;
}
Trang 192.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
{return(x==pt.x && y==pt.y);}
// truyen bang tham chieu
int coincide(point *pt)
{return(x==pt->x && y==pt->y);}
//truyen bang con tro int coincide(point &pt) {return(x==pt.x && y==pt.y);}
} }
Trang 21Có thể gán 2 đối tượng cùng kiểu
x 5
2 x
y
Trang 22Khi các đối tượng có chứa thành phần dữ liệu động
5
b a
5 2
Vùng dữ liệu động
z z
x y
x
Trang 23- 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.
Trang 25point(int ox,int oy) {x=ox;y=oy;}//ham thiet lap
void move(int dx,int dy) ;
cout<<“Toa do : “<<x<<" "<<y<<"\n"; }
void main() {clrscr();
point a(5,2); //ham thiet lap
Trang 264.1 H àm thiết lập
Đặc điểm của hàm thiết lập
- Hàm thiết lập có tên trùng với tên lớp
- Hàm thiết lập phải có thuộc tính public
- Hàm thiết lập không có giá trị trả về, không cần khai báo void
- Có thể có nhiều hàm thiết lập trong cùng một lớp
- Khi tạo đối tượng từ một lớp có nhiều hàm thiết lập thì các tham số truyền phải phù hợp với một trong các hàm thiết lập
Trang 28point(int ox,int oy) {x=ox;y=oy;}
void move(int dx,int dy) ;
void main() {point a(5,2); //OK
Trang 29void main() { clrscr();
point a(5,2); //OK a.display();
Trang 31point(int ox = 1,int oy =0) {x=ox;y=oy;}
void move(int dx,int dy) ;
void main() { clrscr();
Trang 34- Xây dựng lớp hàng hóa có các thuộc tính sau: Tên hàng, mã hàng,
nhãn hiệu, giá bán, giá mua, số lượng
- Các phương thức đối với hàng hóa: nhập hàng, bán hàng, tăng giá,
giám giá.
- Thực hiện quản lý các mặt hàng: dầu ăn, bia, nước ngọt.
- In ra danh các mặt hàng.
Trang 35Hàm huỷ bỏ được gọi khi đối tượng bị xoá đi khỏi bộ nhớ
cout<<" Goi ham huy bo voi num =
"<<num<<"\n";
} void main() { clrscr();
void fct(int);
test a(1);
for(int i=1; i<= 2; i++) fct(i);
} void fct(int p) { test x(2*p);
}
Trang 36Một số qui định đối với hàm huỷ bỏ
- Tên của hàm huỷ bỏ bắt đầu bằng dấu ~ và theo sau là tên lớp
- Hàm huỷ bỏ phải có thuộc tính public
- Hàm thiết lập không có tham số, trong một lớp chỉ có một hàm thiết lập
- Khi không định nghĩa hàm huỷ bỏ, chương trình dịch tự động sinh một hàm huỷ bỏ ngầm định, đối với các lớp không có khai báo các thành phần bộ nhớ động thì có thể dùng hàm huỷ bỏ ngầm định, ngược lại nên có hàm huỷ bỏ tường minh
- Hàm huỷ bỏ không có giá trị trả về
Trang 37Với biến nguyên
point p(2,3);//Lớp point có hàm thiết lập hai tham số
point q;// Lớp point có hàm thiết lập không tham số
q = p; // phép gán 2 đối tượng
Trang 38- Nếu không được mô tả tường minh, trong khai báo của một lớp có ít nhất hai hàm thiết lập ngầm định: hàm thiết lập ngầm định và hàm thiết lập sao chép ngầm định
- Với các lớp không có khai báo thành phần dữ liệu động thì chỉ cần dùng các hàm thiết lập ngầm định
Trang 394.4 Khai báo và định nghĩa hàm thiết lập sao chép tường minh
- Câu lệnh point q=p; tương đương point q(p);
Dạng khai báo của hàm thiết lập là: point (point &); hoặc point(const point &);
Trang 40cout<<"Tao doi tuong : "<<this<<endl;
cout<<"Dung ham thiet lap hai tham so\
n";
x=ox;y=oy;
}
point(point &p) {
cout<<"Tao doi tuong : "<<this<<endl;
cout<<"Dung ham thiet lap sao chep\n";
};
void point::display() { cout<<"Toa do : "<<x<<" "<<y<<"\n"; }
point fct(point a) { point b=a;
b.move(2,3);
return b;
}
Trang 42b.n b.x
b.n b.x
Trang 43- Các thành phần dữ liệu tĩnh static chỉ có một phiên bản trong tất cả các đối tượng, không thể khởi tạo chúng bằng các hàm thiết lập của một lớp, không thể khởi tạo lúc khai báo
Trang 44} void main() { clrscr();
void fct();
counter a;
fct();
counter b;
// đối tượng b hủy bỏ trước, đối tượng a hủy
bỏ sau.theo cấu trúc stack }
void fct() { counter u,v;
}
Trang 45- Hàm thành phần tĩnh static không có tham số ngầm định
- Hàm thành phần tĩnh của một lớp có thể gọi cho dù chưa có khai báo các đối tượng của lớp đó
- Thông thường các hàm thành phần tĩnh static được dùng để xử lý chung trên tất cả các đối tượng của lớp
Trang 46} void main() { clrscr();
counter::counter_display();//goi qua lop counter v;
v.counter_display();//goi qua lop }
Trang 47- C++ cho phép bên ngoài truy cập tới thành phần private của lớp dựa trên khái niệm “hàm bạn”
Trang 48int coincide (point p, point q) {
if ((p.x == q.x) && (p.y == q.y)) return 1;
else return 0;
}
void main() { point a(1,0),b(1),c;
if (coincide (a,b)) cout <<"a trung voi b\n"; else cout<<"a va b khac nhau\n";
if (coincide(a,c)) cout<<"a trung voi c\n"; else cout<<"a va c khac nhau\n";
}
Trang 497.2 Hàm thành phần của một lớp là bạn của lớp khác
A, B là hai lớp
int f(char, A); là một hàm trong lớp B
Nếu f có nhu cầu truy xuất vào các thành phần riêng của A thì f cần được khai báo là bạn của A trong lớp A như sau
friend int B::f(char, A);
Trang 527.3 Tất cả các hàm của lớp là bạn của lớp khác
Tất cả các hàm của lớp B là bạn của lớp A, ta đặt trong A khai báo sau friend class B;
Trang 537.4 Ví dụ bài toán nhân ma trận với vector- dùng hàm bạn tự do
public:
matrix(double t[3][3]) { int i; int j;
for(i=0; i<3; i++) for(j=0; j<3; j++) mat[i][j] = t[i][j];
} friend vect prod (matrix, vect);
};
Trang 547.4 Ví dụ bài toán nhân ma trận với vector- dùng hàm bạn tự do
vect prod (matrix m, vect x) {
vect res;
double tb[3][3] = {1,2,3,4,,5,6,7,8,9}; matrix a(tb);
res=prod(a,w); res.display();
}
Trang 557.4 Ví dụ bài toán nhân ma trận với vector- dùng hàm thành phần là bạn của một lớp
void display () { int i;
for (int i=0; i<3; i++) cout<<v[i]<<" ";
cout<<endl;
} };
Trang 567.4 Ví dụ bài toán nhân ma trận với vector- dùng hàm thành phần là bạn của một lớp
vect matrix::prod (vect x) {