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. Đối tượng và lớp đối tượng ......................................................................................... 2
Khái niệm........................................................................................................................ 2
Tầm vực .......................................................................................................................... 3
Toán tử ::......................................................................................................................... 4
Con trỏ this...................................................................................................................... 4
Áp dụng........................................................................................................................... 5
2. Phương thức getter và setter ........................................................................................ 7
3. Toán tử new và delete................................................................................................ 10
delete............................................................................................................................. 10
4. Hàm dựng và hàm hủy............................................................................................... 11
Hàm dựng...................................................................................................................... 11
Hàm hủy........................................................................................................................ 12
5. Hàm toán tử trong lớp đối tượng............................................................................... 13
6. Bài tập:....................................................................................................................... 14
tploc/[email protected]n
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.
}
};
tploc/[email protected]n
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.
}
tploc/[email protected]n
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;
}
};
tploc/[email protected]n
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)
{
tploc/[email protected]n
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.
tploc/[email protected]n
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)
{
tploc/[email protected]n
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);
tploc/[email protected]n
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;
}
tploc/[email protected]n
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.
tploc/[email protected]n
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);
}
tploc/[email protected]n
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;
};
tploc/[email protected]n
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;
tploc/[email protected]n
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,b R
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, …).
tploc/[email protected]n
14
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:
tai_lieu_huong_dan_thuc_hanh_mon_phuong_phap_lap_trinh_huong.pdf

