Tài liệu hướng dẫn thực hành môn Phương pháp lập trình hướng đối tượng - Tuần 2: Đối tượng và lớp đối tượng

Tác giả:  
Môn PPLTHĐT  
Nguyễn Minh Huy  
Phạm Minh Tuấn  
Cập nhật:  
Hướng dẫn thực hành tuần 2  
Trương Phước Lộc  
Trần Duy Quang  
Mục đích  
Giới thiệu sơ lược về đối tượng và lớp đối tượng, cách cấp phát và giải phóng vùng nhớ  
trong C++, tìm hiểu một số khái niệm liên quan đến đối tượng: hàm dựng, hàm hủy và  
hàm toán tử trong lớp đối tượng.  
Nội dung  
-
-
-
-
-
Đối tượng và lớp đối tượng.  
Hàm getter và setter  
Toán tử new và delete.  
Hàm dựng và hàm hủy.  
Các hàm toán tử trong lớp đối tượng.  
Yêu cầu  
Nắm vững những nội dung trình bày trong bài hướng dẫn thực hành số 1.  
Hướng dẫn thực hành tuần 2  
Đối tượng và lớp đối tượng  
Mục lục  
1
Hướng dẫn thực hành tuần 2  
Đối tượng và lớp đối tượng  
1. Đối tượng và lớp đối tượng  
Khái niệm  
Đối tượng (object) là một thực thể phần mềm bao gồm dữ liệu và những xử lý trên dữ  
liệu đó. Thành phần dữ liệu được gọi là thuộc tính (attribute), thành phần xử lý được gọi  
là phương thức (method).  
Thuộc tính ẩn chứa bên trong đối tượng mà những gì bên ngoài không thể truy xuất đến  
được. Phương thức là cách thức duy nhất để những gì bên ngoài đối tượng thực hiện  
những xử lý trên thuộc tính và thông qua những xử lý này thuộc tính của đối tượng thay  
đổi.  
Tập hợp các đối tượng có cùng kiểu thuộc tính và phương thức tạo thành lớp đối tượng  
(class). Trong C++, lớp đối tượng được khai báo theo cấu trúc sau:  
class <Tên lớp>  
{
private:  
<Khai báo thành phần riêng>  
public:  
<Khai báo thành phần công cộng>  
};  
Ví dụ xây dựng lớp đối tượng đơn giản:  
class SampleClass  
{
private:  
// Thuoc tinh cua lop SampleClass.  
int  
m_iVar1;  
float m_fVar2;  
public:  
// Phuong thuc cua lop SampleClass.  
void f1()  
{
// Viet xu ly cho f1 o day.  
}
void f2()  
{
// Viet xu ly cho f2 o day.  
}
};  
2
   
Hướng dẫn thực hành tuần 2  
Đối tượng và lớp đối tượng  
Tầm vực  
Tầm vực (scope) của các thành phần bên trong lớp đối tượng định nghĩa phạm vi hoạt  
động của những thành phần đó. Có 3 loại tầm vực dành cho các thành phần bên trong lớp  
đối tượng: public, private, và protected. Ở đây chúng ta tạm thời chỉ đề cập đến 2 tầm vực  
public và private.  
Ý nghĩa của các tầm vực này như sau:  
Sử dụng bên trong lớp  
Sử dụng bên ngoài lớp  
X
X
X
Public  
Private  
class SampleClass  
{
private:  
int  
m_iPrivateVar;  
void f1()  
{
// Viet xu ly cho f1 o day.  
}
public:  
int  
m_iPublicVar;  
void f2()  
{
m_iPrivateVar = 1; // Thuoc tinh va phuong thuc private  
f1();  
// co the truy cap trong pham vi lop.  
}
};  
void main()  
{
SampleClass obj;  
obj.m_iPrivateVar = 1;  
obj.f1();  
// Thuoc tinh va phuong thuc private  
// khong the truy cap ngoai pham vi lop.  
obj.m_iPublic = 1;  
obj.f2();  
// Thuoc tinh va phuong thuc public  
// co the truy cap ngoai pham vi lop.  
}
3
 
Hướng dẫn thực hành tuần 2  
Đối tượng và lớp đối tượng  
Toán tử ::  
Toán tử :: hay còn gọi là toán tử phân giải miền (scope resolution operator) được sử dụng  
để chỉ ra một cách tường minh một thuộc tính hoặc phương thức là thuộc một lớp đối  
tượng nào đó.  
Ví dụ:  
Employee::m_sName  
Circle::Draw()  
// De cap den thuoc tinh m_sName cua lop Employee.  
// De cap den phuong thuc Draw() cua lop Circle.  
Khi định nghĩa một phương thức bên ngoài lớp, chúng ta phải sử dụng toán tử phân giải  
miền để chỉ ra tường minh phương thức đó thuộc lớp nào.  
Ví dụ hai cách định nghĩa phương thức sau là tương đương nhau:  
class A  
{
class A  
{
public:  
public:  
int f();  
int f()  
{
};  
// Cai dat phuong thuc f().  
int A::f()  
{
}
};  
// Cai dat phuong thuc f().  
}
Một lớp đối tượng trong C++ thường được lưu trữ trong 2 file: *.h và *.cpp. File *.h chứa  
phần khai báo (decleration) của lớp đối tượng, trong khi file *.cpp chứa phần định nghĩa.  
Con trỏ this  
Con trỏ this được sử dụng trong phạm vi của lớp đối tượng. Nó đại diện cho con trỏ đang  
trỏ đến đối tượng gọi thực hiện phương thức đó.  
Ví dụ:  
#include <iostream>  
using namespace std;  
class A  
{
public:  
void ShowThis()  
{
cout << this << endl;  
}
};  
4
   
Hướng dẫn thực hành tuần 2  
Đối tượng và lớp đối tượng  
void main()  
{
A
obj1, obj2;  
obj1.ShowThis();  
obj2.ShowThis();  
}
Áp dụng  
Để hiểu rõ hơn về đối tượng và lớp đối tượng, chúng ta xét ví dụ xây dựng lớp PhanSo.  
Bước 1: vào VC++, tạo project dạng Console Application.  
Bước 2: thêm vào project file PhanSo.h và khai báo lớp PhanSo.  
class PhanSo  
{
private:  
int  
int  
m_iTuSo;  
m_iMauSo;  
public:  
};  
void Nhap();  
void Xuat();  
PhanSo Cong(const PhanSo &a);  
Bước 3: thêm vào project file PhanSo.cpp và định nghĩa các phương thức cho lớp  
PhanSo.  
#include <iostream>  
using namespace std;  
#include "PhanSo.h"  
void PhanSo::Nhap()  
{
cout << “Nhập tử”;  
cin >> this->m_iTuSo;  
cout << “Nhập mẫu”;  
cin >> this->m_iMauSo;  
}
void PhanSo::Xuat()  
{
cout << this->m_iTuSo << “/” << this->m_iMauSo;  
}
PhanSo PhanSo::Cong(const PhanSo &a)  
{
5
 
Hướng dẫn thực hành tuần 2  
PhanSo c;  
Đối tượng và lớp đối tượng  
c.m_iTuSo = this->m_iTuSo * a.m_iMauSo + a.m_iTuSo * this->m_iMauSo;  
c.m_iMauSo = this->m_iMauSo * a.m_iMauSo;  
return c;  
}
Bước 4: thêm vào project file main.cpp và viết đoạn chương trình sử dụng lớp PhanSo  
vừa tạo.  
#include <iostream>  
using namespace std;  
#include "PhanSo.h"  
void main()  
{
PhanSo  
a, b, c;  
a.Nhap();  
b.Nhap();  
c = a.Cong(b);  
cout << "Ket qua: “;  
c.Xuat();  
}
Bước 5: biên dịch và chạy thử chương trình.  
Trong lớp PhanSo ở trên, các thuộc tính m_iTuSo và m_iMauSo được khai báo trong  
phần “private” nên có tầm vực là private, vì vậy chúng ta không thể truy cập được chúng  
từ bên ngoài lớp. Trong khi đó, những phương thức được khai báo trong phần “public”  
nên có tầm vực là public, do đó chúng có thể được gọi từ bên ngoài lớp.  
6
Hướng dẫn thực hành tuần 2  
Toán tử new và delete  
2. Phương thức getter và setter  
Trong hướng đối tượng, để tránh việc can thiệp trực tiếp vào thuộc tính của một đối  
tượng (tính đóng gói) hoặc để cung cấp phương thức tương tác với các thuộc tính của đối  
tượng, chúng ta cần cung cấp các phương thức getter và setter cho mỗi thuộc tính của đối  
tượng. Getter là phương thức trả ra giá trị của một thuộc tính của đối tượng. Setter là  
phương thức khởi tạo giá trị cho một thuộc tính của đối tượng  
Ví dụ trong lớp PhanSo ở ví dụ trên, các thuộc tính m_iTuSo và m_iMauSo được khai  
báo trong phần “private” nên có tầm vực là private, vì vậy chúng ta không thể truy cập  
được chúng từ bên ngoài lớp và phải cung cấp các phương thức getter/setter cho chúng.  
Tập tin PhanSo.h được thêm vào các phương thức getter/setter như sau  
class PhanSo  
{
private:  
int  
int  
m_iTuSo;  
m_iMauSo;  
public:  
int LayTuSo();//getter  
int LayMauSo();//getter  
void DatTuSo(int iTuso);//setter  
void DatMauSo(int iMauSo);//setter  
void Nhap();  
void Xuat();  
PhanSo Cong(const PhanSo &a);  
};  
Tập tin “PhanSo.cpp”  
#include <iostream>  
using namespace std;  
#include "PhanSo.h"  
int PhanSo::LayTuSo()  
{
return m_iTuSo;  
}
int PhanSo::layMauSo()  
{
return m_iMauSo;  
}
void PhanSo::DatTuSo(int iTuSo)  
{
7
 
Hướng dẫn thực hành tuần 2  
Toán tử new và delete  
m_iTuSo = iTuSo;  
}
void PhanSo::DatMauSo(int iMauSo)  
{
m_iMauSo = iMauSo;  
}
void PhanSo::Nhap()  
{
cout << “Nhập tử”;  
cin >> this->m_iTuSo;  
cout << “Nhập mẫu”;  
cin >> this->m_iMauSo;  
}
void PhanSo::Xuat()  
{
cout << this->m_iTuSo << “/” << this->m_iMauSo;  
}
PhanSo PhanSo::Cong(const PhanSo &a)  
{
PhanSo  
c;  
c.m_iTuSo = this->m_iTuSo * a.m_iMauSo + a.m_iTuSo * this->m_iMauSo;  
c.m_iMauSo = this->m_iMauSo * a.m_iMauSo;  
return c;  
}
Tập tin “main.cpp”  
#include <iostream>  
using namespace std;  
#include "PhanSo.h"  
void main()  
{
PhanSo  
a, b, c;  
a.DatTuSo(1);  
a.DatMauSo(2);  
b.DatTuSo(1);  
b.DatMauSo(3);  
8
Hướng dẫn thực hành tuần 2  
Toán tử new và delete  
c = a.Cong(b);  
cout << "Tu so c = " << c.LayTuSo() << endl;  
cout << "Mau so c = " << c.LayMauSo() << endl;  
}
9
Hướng dẫn thực hành tuần 2  
Toán tử new và delete  
3. Toán tử new và delete  
Trước đây trong C, việc cấp phát và giải phóng vùng nhớ được thực hiện thông qua các  
hàm trong thư viện “alloc.h”.  
Ví dụ cấp phát vùng nhớ 10 byte dùng để chứa chuỗi ký tự:  
unsigned char *s = (unsigned char *)malloc(10);  
// ...  
// ...  
// ...  
free(s);  
Trong C++, việc cấp phát và giải phóng vùng nhớ được tích hợp trực tiếp vào bên trong  
ngôn ngữ thông qua 2 toán tử new và delete.  
new  
Toán tử new dùng để cấp phát vùng nhớ cho một con trỏ thuộc một kiểu dữ liệu nào đó.  
Ví dụ:  
int  
*p = new int[10];  
// Cap phat vung nho dung de chua 10 so nguyen  
// cho con tro p.  
unsigned char *s = new char[10]; // Cap phat vung nho dung de chua 10 ky tu  
// cho con tro s.  
PhanSo  
*a = new PhanSo;  
// Cap phat vung nho dung de chua  
// doi tuong PhanSo cho con tro a.  
delete  
Toán tử delete dùng để giải phóng vùng nhớ đã được cấp phát bằng toán tử new cho  
một con trỏ nào đó.  
Ví dụ:  
delete []p;  
delete []s;  
delete a;  
// Giai phong vung nho da cap phat cho con tro p.  
// Giai phong vung nho da cap phat cho con tro s.  
// Giai phong vung nho da cap phat cho con tro a.  
10  
     
Hướng dẫn thực hành tuần 2  
Hàm dựng và hàm hủy  
4. Hàm dựng và hàm hủy  
Hàm dựng  
Hàm dựng (constructor) của một lớp đối tượng là một phương thức đặc biệt được tự  
động gọi thực hiện khi đối tượng thuộc lớp đó được tạo lập.  
Các tính chất của hàm dựng:  
-
-
-
-
Được tự động gọi thực hiện khi đối tượng được tạo lập.  
Không có giá trị trả về (nhưng có thể có các tham số).  
Một lớp đối tượng có thể có nhiều hàm dựng khác nhau.  
Trong C++, hàm dựng có tên trùng với tên lớp.  
Bất kỳ lớp đối tượng nào cũng có hàm dựng. Trong trường hợp chúng ta không khai báo  
hàm dựng nào cho lớp đối tượng, hàm dựng mặc định (default constructor) không tham  
số sẽ được tự động thêm vào.  
Ví dụ sau thể hiện các tính chất của hàm dựng:  
#include <iostream>  
using namespace std;  
class SampleClass  
{
public:  
SampleClass()  
{
}
SampleClass(int x)  
{
cout << "Khoi tao doi tuong voi tham so la so nguyen.";  
}
SampleClass(int x, char *s)  
{
cout << "Khoi tao doi tuong voi tham so la so nguyen va chuoi ky tu.";  
}
};  
void main()  
{
SampleClass obj1(5);  
SampleClass obj2(5, "hello");  
SampleClass *p = new SampleClass(2);  
}
11  
   
Hướng dẫn thực hành tuần 2  
Hàm dựng và hàm hủy  
Hàm hủy  
Hàm hủy (destructor) của một lớp đối tượng là một phương thức đặc biệt được tự động  
gọi thực hiện khi đối tượng thuộc lớp đó bị hủy đi.  
Các tính chất của hàm hủy:  
-
-
-
-
Được tự động gọi thực hiện khi đối tượng bị hủy đi.  
Không có giá trị trả về lẫn tham số.  
Một lớp đối tượng chỉ có duy nhất một hàm hủy.  
Trong C++, hàm hủy có tên trùng với tên lớp và thêm dấu “~” phía trước.  
Ví dụ sau thể hiện các tính chất của hàm hủy:  
#include <iostream>  
using namespace std;  
class SampleClass  
{
public:  
virtual ~SampleClass()  
{
cout << "Huy bo doi tuong.";  
}
};  
void main()  
{
SampleClass obj;  
SampleClass *p = new SampleClass;  
delete p;  
};  
12  
 
Hướng dẫn thực hành tuần 2  
Hàm toán tử trong lớp đối tượng  
5. Hàm toán tử trong lớp đối tượng  
Cũng như các hàm thông thường, chúng ta được phép định nghĩa các hàm toán tử cho lớp  
đối tượng. Để hiểu rõ hơn về hàm toán tử trong lớp đối tượng, chúng ta xét ví dụ định  
nghĩa các hàm toán tử + và so sánh > cho lớp đối tượng PhanSo đã xây dựng ở trên.  
Bước 1: vào file PhanSo.h, trong phần public của lớp PhanSo, thêm vào khai báo cho  
hàm dựng và 2 hàm toán tử + và so sánh >.  
PhanSo();  
PhanSo(int iTuSo, int iMauSo);  
PhanSo operator +(const PhanSo &a)const;  
bool operator >(const PhanSo &a);  
Bước 2: vào file PhanSo.cpp, thêm phần cài đặt cho các hàm dựng và 2 toán tử + và so  
sánh >.  
PhanSo::PhanSo()  
{
m_iTuSo = 0;  
m_iMauSo = 1;  
}
PhanSo::PhanSo(int iTuSo, iMauSo)  
{
if (iMauSo == 0)  
{
cout << "Loi: mau so nhap vao bang 0."  
return;  
}
m_iTuSo = iTuSo;  
m_iMauSo = iMauSo;  
}
PhanSo PhanSo::operator +(const PhanSo &a) const  
{
return this->cong(a);  
}
bool PhanSo::operator >(const PhanSo &a)  
{
long lMauSoQuyDong = (long)this->iMauSo * a.iMauSo;  
long lTuSoQuyDong = (long)this->iTuSo * a.iMauSo;  
long lTuSoQuyDongA = (long)a.iTuSo * this->iMauSo;  
if (lMauSoQuyDong > 0)  
return lTuSoQuyDong > lTuSoQuyDongA;  
13  
 
Hướng dẫn thực hành tuần 2  
Hàm toán tử trong lớp đối tượng  
return lTuSoQuyDong < lTuSoQuyDongA;  
}
Bước 3: sửa lại file main.cpp để sử dụng lớp PhanSo với những toán tử vừa tạo.  
#include <iostream>  
using namespace std;  
#include "PhanSo.h"  
void main()  
{
PhanSo  
PhanSo  
PhanSo  
a(1, 2);  
b(1, 3);  
c;  
c = a + b;  
cout << "Tu so c = " << c.LayTuSo() << endl;  
cout << "Mau so c = " << c.LayMauSo() << endl;  
if (a > b)  
cout << "Phan so a lon hon phan so b";  
else  
cout << "Phan so a nho hon hoac bang phan so b.";  
}
6. Bài tập:  
Sử dụng lớp đối tượng để làm các bài tập sau:  
1. Xây dựng chương trình cho phép thực hiện các phép toán +, -, *, /, so sánh >, <, ==,  
nhập xuất >>, << trên phân số.  
2. Xây dựng chương trình cho phép thực hiện các phép toán +, -, *, /, so sánh >, <, ==,  
nhập xuất >>, << trên số phức (biểu diễn dưới dạng a + bi, với  
).  
a,bR  
3. Xây dựng chương trình cho phép nhập tọa độ của 2 điểm và xuất ra khoảng cách giữa  
2 điểm.  
4. Xây dựng chương trình cho phép nhập vào tọa độ 3 đỉnh của 1 tam giác, chương trình  
xuất ra chu vi, diện tích và trọng tâm của tam giác.  
5. Xây dựng chương trình cho phép nhập vào tọa độ 1 điểm và thông tin của 1 đường  
tròn (tâm và bán kính), chương trình xuất ra vị trí tương đối của điểm và đường tròn.  
6. Xây dựng chương trình cho phép nhập vào tọa độ 4 đỉnh của 1 tứ giác, chương trình  
xuất ra chu vi, diện tích của tứ giác.  
7. Sắp xếp tăng dần mảng kiểu T (int, float, PhanSo, SoPhuc, …).  
14  
 
pdf 15 trang myanh 16460 Free
Bạn đang xem tài liệu "Tài liệu hướng dẫn thực hành môn Phương pháp lập trình hướng đối tượng - Tuần 2: Đối tượng và lớp đối tượng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdftai_lieu_huong_dan_thuc_hanh_mon_phuong_phap_lap_trinh_huong.pdf