Lập trình có cấu trúc/lập trình thủ tục• Nhược điểm – dữ liệu và mã xử lý là tách rời – người lập trình phải biết cấu trúc dữ liệu vấn đề này một thời gian dài được coi là hiển nhiên –
Trang 1Cơ bản về hướng đối tượng
và C++
Trang 2Tài liệu tham khảo
• Bài giảng LTHĐT, Trần Minh Châu, Đại học
Công nghệ, ĐH Quốc gia HN
• Bài giảng LTHĐT, Nguyễn Việt Hà, Đại học Công nghệ, ĐH Quốc gia HN
• Bài giảng LTHĐT, Nguyễn Ngọc Long, ĐH KHTN TPHCM
• Bài giảng LTHĐT, Huỳnh Lê Tấn Tài, ĐH KHTN TPHCM
• C++ How to Program, Dietel
• ………
Trang 3Mục tiêu của kỹ sư phần mềm
• Tạo ra sản phẩm tốt một cách có hiệu quả
• Nắm bắt được công nghệ
Trang 4Độ phức tạp và độ lớn ngày càng
cao
• Một số hệ Unix chứa khoảng 4M dòng lệnh
• MS Windows chứa hàng chục triệu dòng lệnh
• Người dùng ngày càng đòi hỏi nhiều chức
năng, đặc biệt là chức năng thông minh
• Phần mềm luôn cần được sửa đổi
Trang 5– Giảm chi phí và thời gian phát triển
– Nâng cao chất lượng
Trang 8Lập trình không có cấu trúc
• Là phương pháp xuất hiện đầu tiên
– các ngôn ngữ như Assembly, Basic
Trang 10• Mỗi chương trình con này lại có thể chia nhỏ thành
các chương trình con nhỏ hơn
Chương trình = Cấu trúc dữ liệu + Giải thuật
Trang 13Lập trình có cấu trúc/lập trình thủ tục
• Nhược điểm
– dữ liệu và mã xử lý là tách rời
– người lập trình phải biết cấu trúc dữ liệu (vấn đề
này một thời gian dài được coi là hiển nhiên)
– khi thay đổi cấu trúc dữ liệu thì mã xử lý (thuật
toán) phải thay đổi theo
– khó đảm bảo tính đúng đắn của dữ liệu
– không tự động khởi tạo hay giải phóng dữ liệu
động
– không mô tả được đầy đủ, trung thực hệ
thống trong thực tế
Trang 14Lập trình Hướng đối tượng
• Trong thế giới thực, chung quanh chúng ta là những đối tượng, đó là các thực thể có mối
quan hệ với nhau Ví dụ: các phòng trong một công ty
• Lập trình hướng đối tượng (Object Oriented Programming - LTHĐT) là phương pháp lập trình
lấy đối tượng làm nền tảng để xây dựng thuật
giải, xây dựng chương trình
Trang 15Một số khái niệm
• Đối tượng (object):
– Trong thế giới thực, khái niệm đối tượng được
hiểu như là một thực thể: người, vật hoặc một
Trang 16Một số khái niệm
• Lớp:
– Các đối tượng có các đặc tính tương tự nhau
được gom chung lại thành lớp đối tượng Ví dụ Người là một lớp đối tượng Một lớp đối tượng
được đặc trưng bằng các thuộc tính, và các hoạt
động (hành vi, thao tác).
– Thuộc tính (attribute) là một thành phần của đối
tượng, có giá trị nhất định cho mỗi đối tượng tại mỗi thời điểm trong hệ thống Vd: Tên, Tuổi, Cân nặng là các thuộc tính của Người
– Thao tác (operation) thể hiện hành vi của một đối
tượng tác động qua lại với các đối tượng khác hoặc với chính nó.
Trang 17• Cùng một thao tác(phương thức) có thể được
áp dụng cho nhiều lớp đối tượng khác nhau, một
thao tác như vậy được gọi là có tính đa hình
(polymorphism)
• Một đối tượng cụ thể thuộc một lớp được gọi là
một thể hiện (instance) của lớp đó
– Joe Smith, 25 tuổi, nặng 58kg, là một thể hiện của lớp người
Trang 18Sơ đồ đối tượng
• Ta dùng sơ đồ đối tượng để mô tả các lớp đối tượng Sơ đồ đối tượng bao gồm sơ đồ lớp và
sơ đồ thể hiện
• Sơ đồ lớp mô tả các lớp đối tượng trong hệ
thống, một lớp đối tượng được diễn tả bằng một hình chữ nhật có 3 phần:
– phần đầu chỉ tên lớp,
– phần thứ hai mô tả các thuộc tính
– phần thứ ba mô tả các thao tác của các đối tượng trong lớp đó
Trang 19Sơ đồ lớp và sơ đồ thể hiện
Sinh viên Họ tên
Năm sinh Mã số
Điểm TB
Đi học
Đi thi Phân loại
(Sinh viên) Nguyễn Văn A 1984
0610234T 9.2
Tên lớp
Thuộc tính
Thao tác
Sơ đồ lớp Sơ đồ thể hiện
Đối tượng = Dữ liệu + Phương thức
Trang 20Các đặc điểm quan trọng của OO
• Các lớp đối tượng - Classes
• Đóng gói – Encapsulation
• Thừa kế - Inheritance
• Đa hình - Polymorphism
Trang 21Trừu tượng hóa
cách nhìn khái quát hóa về một tập các đối tượng có
chung các đặc điểm được quan tâm (và bỏ qua những chi
tiết không cần thiết).
Trang 22Đóng gói – Che dấu thông tin
• Đóng gói: Nhóm những gì có liên quan với nhau vào làm một, để sau này có thể dùng một cái tên
– che giấu những gì mà người dùng không cần
– che giấu những gì mà mình cần giữ bí mật
Trang 23và thao tác đó đã được định nghĩa tại lớp D.
• cho phép cài đặt nhiều quan hệ giữa các đối tượng: đặc biệt hóa (“là”), khái quát hóa
Trang 25Ngôn ngữ lập trình hướng đối tượng
• Cung cấp được những khả năng lập trình hướng đối tượng
– cung cấp khả năng kiểm soát truy cập
– kế thừa
– đa hình
Trang 26Lịch sử ngôn ngữ lập trình
Trang 27Một số thuật ngữ hướng đối tượng
• OOM (Object Oriented Methodology): Phương
pháp luận hướng đối tượng
• OOA (Object Oriented Analysis): Phân tích
hướng đối tượng
• OOD: Object Oriented Design (Thiết kế hướng
đối tượng)
• OOP: Object Oriented Programming (lập trình
hướng đối tượng)
• Inheritance: Kế thừa
• Polymorphism: Đa hình
• Encapsulation: Tính đóng gói.
Trang 28Các ưu điểm của OOP
• Nguyên lý kế thừa: tránh lặp, tái sử dụng
• Nguyên lý đóng gói hay che dấu thông tin: chương trình
an toàn không bị thay đổi bới những đoạn chương trình khác
• Dễ mở rộng, nâng cấp
• Mô phỏng thế giới thực tốt hơn
Trang 29OOP có các đặc tính chủ yếu sau
• Chương trình được chia thành các đối tượng
• Các cấu trúc dữ liệu được thiết kế sao cho đặc
tả được đối tượng
• Các hàm thao tác trên các vùng dữ liệu của đối tượng được gắn với cấu trúc dữ liệu đó
Trang 30• Chương trình được thiết kế theo cách tiếp cận từ
dưới lên (bottom-up).
Trang 32Khác biệt đối với C
Trang 34– void swap1(int x, int y) { int t = x; x = y; y = t; }
– void swap2(int *x, int *y) { int *t = x; x = y; y = t; }
– void swap3(int &x, int &y) { int t = x; x = y; y = t; }
Trang 35Chồng hàm (Functions overloading )
int abs(int i);
int abs(int i) { return abs(i);}
long abs(long l) { return labs(l);}
double abs(double d) { return fabs(d);}
void test_abs() {
int i = abs(10); // abs(int )
long l = abs(-10l); // abs(long )
double = abs(0.1l); // abs(double )
}
Trang 36Tham số ngầm định trong lời gọi hàm
Trang 37Toán tử quản lý bộ nhớ động
• Toán tử cấp phát bộ nhớ động new
int *x;
x = new int; // x = (int*)malloc(sizeof(int)); char *y;
y = new char[100]; // y = (char*)malloc(100);
• Toán tử giải phóng vùng nhớ động delete
delete x; // free(x);
delete y; // free(y);
Trang 38• Nên khai báo hằng đối với:
– Các đối tượng mà ta không định sửa đổi
– const double PI = 3.14;
– const Date openDate(18,8,2003);
– Các tham số của hàm mà ta không định cho hàm
đó sửa đổi
– void printHeight(const LargeObj &LO)
{ cout << LO.height; }
– Các hàm thành viên không thay đổi đối tượng chủ
– int Date::getDay() const { return day; }
Trang 39Lớp trong C++
• Một lớp bao gồm các thành phần dữ liệu hay là thuộc tính và các phương thức hay là hàm thành phần
• Lớp trong C++ thực chất là một kiểu dữ liệu do người sử dụng định nghĩa
Trang 40Đối tượng
• Lưu giữ trạng thái: mỗi đối tượng có trạng thái
(dữ liệu của nó) và các thao tác
• Định danh: Mỗi đối tượng bất kể đang ở trạng
thái nào đều có định danh và được đối xử như một thực thể riêng biệt
• Thông điệp: là phương tiện để một đối tượng A
chuyển tới đối tượng B yêu cầu B thực hiện một trong số các thao tác của B
Trang 41Lớp đối tượng - class
• Lớp: là khuôn mẫu để tạo các đối tượng (tạo các thể hiện) Mỗi đối tượng có cấu trúc và hành vi giống như lớp đối tượng mà nó được tạo từ đó
• Lớp là cái ta thiết kế và lập trình
• Đối tượng là cái ta tạo (từ một lớp) tại thời gian chạy
Trang 43Định nghĩa các hàm thành phần ở
bên ngoài khai báo lớp
<tên kiểu giá trị trả lại> <tên lớp>::<tên hàm> (<danh sách tham số>)
{
<nội dung >
}
void point::display() { …… }
Trang 44• Tạo đối tượng:
<tên lớp> <tên đối tượng>
<tên đối tượng> = new <tên lớp>
• Gọi hàm thành phần của lớp
<tên đối tượng>.<tên hàm thành phần>(<danh sách các tham số nếu có>);
<tên con trỏ đối tượng><tên hàm thành
phần>(<danh sách các tham số nếu có>);
Trang 45• Khởi tạo
• Di chuyển
• In ra màn hình
• …………
Trang 46void init(int ox, int oy);
void move(int dx, int dy);
void display();
};
Trang 47void point::init(int ox, int oy) {
cout<<"Ham thanh phan init\n";
x = ox; y = oy;
/*x,y là các thành phần của đối tượng gọi hàm thành phần*/
}
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";
}
Trang 49Ham thanh phan init
Ham thanh phan displayToa do: 2 4
Ham thanh phan moveHam thanh phan displayToa do: 3 6
Trang 50Từ khoá xác định thuộc tính truy xuất
• Trong định nghĩa của lớp ta có thể xác định khả năng truy xuất thành phần của một lớp nào đó
từ bên ngoài phạm vi lớp
• private và public là các từ khoá xác định thuộc
tính truy xuất
• Mọi thành phần được liệt kê trong phần public
đều có thể truy xuất trong bất kỳ hàm nào
• 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
Trang 51Từ khoá xác định thuộc tính truy xuất
• Trong lớp có thể có nhiều nhãn private và public
• Mỗi nhãn này có phạm vi ảnh hưởng cho đến
khi gặp một nhãn kế tiếp hoặc hết khai báo lớp
• Nhãn private đầu tiên có thể bỏ đi vì C++ ngầm
hiểu rằng các thành phần trước nhãn public đầu tiên là private
Trang 52class tamgiac{
private:
float a,b,c;/*độ dài ba cạnh*/
public:
void nhap();/*nhập vào độ dài ba cạnh*/
void in();/*in ra các thông tin liên quan đến tam giác*/
private:
int loaitg();/*cho biết kiểu của tam giác: 1-d,2-vc,3-c,4-v,5-t*/
float dientich();/*tính diện tích của tam giác*/
};
Trang 53class tamgiac{
private:
float a,b,c;/*độ dài ba cạnh*/
int loaitg();/*cho biết kiểu của tam giác: 1-d,2-vc,3-c,4-v,5-t*/
float dientich();/*tính diện tích của tam giác*/
public:
void nhap();/*nhập vào độ dài ba cạnh*/
void in();/*in ra các thông tin liên quan đến tam giác*/
};
Trang 54Đối tượng như tham số của hàm thành
phần
• Hàm thành phần có quyền truy nhập đến các thành phần private của đối tượng gọi nó:
void point::init (int xx,int yy)
{
}
Trang 55Đối tượng như tham số của hàm thành
phần
• Hàm thành phần có quyền truy nhập đến tất cả các 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 của nó
int trung(point pt) {return(x==pt.x && y==pt.y);}
int trung(point *pt) {return(x==pt->x && y==pt->y);}
int trung(point &pt) {return(x==pt.x && y==pt.y);}
Trang 56Con trỏ this
• Từ khoá this trong định nghĩa của các hàm thành phần lớp dùng để xác định địa chỉ của đối tượng dùng làm tham số ngầm định cho hàm thành phần
• Con trỏ this tham chiếu đến đối tượng đang gọi hàm thành phần
int trung(point pt)
{return(this->x==pt.x && this->y==pt.y);}
Trang 572
x y
việc sao chép giá trị các thành phần
dữ liệu (x, y) từ đối tượng a sang đối tượng b tương ứng từng đôi một
Trang 58Phép gán đối tượng
• Nếu hai đối tượng A và B cùng kiểu, có các
thành phần dữ liệu x,y(tĩnh) và z là một con trỏ chỉ đến một vùng nhớ được cấp phát động
vùng dữ liệu động
zz
xy
x
Sao chép bề mặt
Trang 59Hàm thiết lập - Constructor
• Constructor là một loại phương thức đặc biệt
dùng để khởi tạo thể hiện của lớp
• Bất kể loại cấp phát bộ nhớ nào được sử dụng (tự động, tĩnh,động), mỗi khi một thể hiện của lớp được tạo, một hàm constructor nào đó của lớp sẽ được gọi
Trang 60point(int ox,int oy) {x=ox;y=oy;}/*hàm thiết lập*/
void move(int dx,int dy) ;
void display();
};
point a(5,2); //int i(5)
Trang 61• Constructor có cùng tên với tên của lớp
• Constructor không có giá trị trả về (kể cả void)
• Constructor phải có thuộc tính public
• Constructor có thể được khai báo chồng như các hàm C++ thông thường khác
• Constructor có thể được khai báo với các tham
số có giá trị ngầm định
Trang 62point(int ox,int oy) {x=ox;y=oy;}/*hàm thiết lập*/
void move(int dx,int dy) ;
Trang 63point(int ox,int oy=1) {x=ox;y=oy;}/*hàm thiết lập*/
void move(int dx,int dy) ;
Trang 64Constructor mặc định
• Constructor mặc định (default constructor) là
constructor được gọi khi thể hiện được khai báo
mà không có đối số nào được cung cấp
• MyClass x;
• MyClass* p = new MyClass;
• Ngược lại, nếu tham số được cung cấp tại khai báo thể hiện, trình biên dịch sẽ gọi phương thức constructor khác (overload)
• MyClass x(5);
• MyClass* p = new MyClass(5);
Trang 66point(int ox,int oy=1) {x=ox;y=oy;}/*hàm thiết lập*/
void move(int dx,int dy) ;
Trang 67point(int ox=0,int oy=0) {x=ox;y=oy;}/*hàm thiết lập*/
void move(int dx,int dy) ;
Trang 68Copy constructor
Trang 70class vector {
int n; //số chiều
float *v; //vùng nhớ toạ độ
public:
vector(); //Hàm thiết lập không tham số
vector(int size); //Hàm thiết lập một tham số
vector(int size, float *a);
~vector();//Hàm huỷ bỏ, luôn luôn không có tham số
void display();
};
Trang 71Hàm bạn, lớp bạn
• Giả sử có lớp Vector, lớp Matrix
• Cần viết hàm nhân 1 Vector và 1 Matrix
• Hàm nhân:
– Không thể thuộc lớp Vector
– Không thể thuộc lớp Matrix
– Không thể tự do
• Giải pháp: xây dựng hàm truy cập dữ liệu
Trang 72Hàm bạn - friend function
• Hàm bạn không thuộc lớp, nhưng có quyền truy cập các thành viên private
• Khi định nghĩa một lớp, có thể khai báo rằng một
hay nhiều hàm “bạn” (bên ngoài lớp)
• Ưu điểm: kiểm soát các truy nhập ở cấp độ lớp - không thể áp đặt hàm bạn cho một lớp nếu điều
đó không được dự trù trước trong khai báo của lớp
Trang 73Các kiểu bạn bè
• Hàm tự do là bạn của một lớp
• Hàm thành phần của một lớp là bạn của một lớp khác
• Hàm bạn của nhiều lớp
• Tất cả các hàm thành phần của một lớp là bạn của một lớp khác
Trang 76Các phương thức Truy vấn
• Các phương thức truy vấn (query method) là các
phương thức dùng để hỏi về giá trị của các thành
viên dữ liệu của một đối tượng
• Có nhiều loại câu hỏi truy vấn có thể:
– truy vấn đơn giản (“giá trị của x là bao nhiêu?”)
– truy vấn điều kiện (“thành viên x có lớn hơn 10 không?”) – truy vấn dẫn xuất (“tổng giá trị của các thành viên x và y
là bao nhiêu?”)
• Đặc điểm quan trọng của phương thức truy vấn là nó không nên thay đổi trạng thái hiện tại của đối tượng
Trang 77Truy vấn
• Đối với các truy vấn đơn giản, quy ước đặt tên phươngthức: tiền tố “get”, tiếp theo là tên của thành viên
• int getX();
• int getSize();
• Các loại truy vấn khác nên có tên có tính mô tả
• Truy vấn điều kiện nên có tiền tố “is”
Trang 78Các phương thức Cập nhật
• Ngược lại với truy vấn, các phương thức cập nhật thường thay đổi trạng thái của đối tượng bằng cách sửa đổi một hoặc nhiều thành viên
dữ liệu của đối tượng đó
• Dạng đơn giản nhất của các phương thức cập nhật là gán một giá trị nào đó cho một thành viên dữ liệu
• Đối với dạng cập nhật đơn giản, quy ước đặt tên: dùng tiền tố “set” kèm theo tên thành viên cần sửa
• int setX(int);
Trang 79Truy vấn và Cập nhật
• Nếu các phương thức get/set chỉ có nhiệm vụ cho ta đọc và ghi giá trị cho các thành viên dữ liệu, quy định các thành viên private để được ích lợi gì?
• Ngoài việc bảo vệ các nguyên tắc đóng gói, ta còn cần kiểm tra xem giá trị mới cho thành viên dữ liệu
có hợp lệ hay không.
• Sử dụng phương thức truy vấn cho phép ta thực
hiện việc kiểm tra trước khi thực sự thay đổi giá trị của thành viên.
• Cho phép chỉ các dữ liệu có thể truy vấn hay thay đổi được truy cập đến.
Trang 81Thành viên tĩnh – static member
• Đối với class, static dùng để khai báo thành
viên dữ liệu dùng chung cho mọi thể hiện của lớp
• một bản duy nhất tồn tại trong suốt quá trình chạy của chương trình,
• dùng chung cho tất cả các thể hiện của lớp,
• bất kể lớp đó có bao nhiêu thể hiện