intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng Kỹ thuật lập trình: Phần 2 - ĐH CNTT&TT

Chia sẻ: Kiếp Này Bình Yên | Ngày: | Loại File: PDF | Số trang:78

65
lượt xem
7
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Tiếp nối nội dung phần 1, phần 2 của bài giảng "Kỹ thuật lập trình" trang bị cho người học những kiến thức về lập trình hướng đối tượng trong C++ và các phương pháp xử lý đồ họa căn bản. Mời các bạn cùng tham khảo để nắm bắt các nội dung chi tiết.

Chủ đề:
Lưu

Nội dung Text: Bài giảng Kỹ thuật lập trình: Phần 2 - ĐH CNTT&TT

  1. Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện Chương 2: Lập trình hướng đối tượng trong C++ 2.1 Lớp và đối tượng 2.1.1 Khái niệm, cú pháp khai báo  Lớp: Lớp là thành phần cơ bản của chương trình hướng đối tượng, dùng để định nghĩa đối tượng.  Đối tượng - Đối tượng là sự thể hiện của lớp. - Mỗi đối tượng được xác định bởi thuộc tính (dữ liệu, biến) và hành vi (phương thức). Thuộc tính để xác định tính chất riêng của đối tượng, hành vi là hành động tác động lên đối tượng.  Cú pháp: //Cú pháp khai báo lớp class tên_lớp{ [mức_độ_truy_cập:] Các_thuộc_tính [mức_độ_truy_cập:] Các_phương_thức }[tên_đối_tượng]; //Cú pháp khai báo đối tượng tên_lớp tên_đối tượng; - Thuộc tính: như khai báo biến - Phương thức: như khai báo hàm  Cách truy xuất: Tên_đối_tượng. Tên_thuộc_tính Tên_đối_tượng. Tên_phương_thức 2.1.2 Mức độ truy cập - Private: chỉ cho phép các hàm trong lớp truy cập đến thành phần này, các lớp khác không thể truy cập. - Public: được phép truy cập từ mọi lớp. - Protected: cho phép các thành viên của cùng một lớp hoặc từ một lớp dẫn xuất của nó. - Khi không có từ khóa truy cập thì toàn bộ các thành viên của lớp được hiểu mặc định là có thuộc tính private. class A class B { { //mac dinh la private void h() int x; { 38 Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
  2. Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện void g() A a; { a.x++;//sai vì x là private của A /*g() trong cùng lớp A với x nên g() } truy xuất đươc x*/ }; x++; int main() } { public: A a; int f() a.g(); //sai vì g là private của A { cout
  3. Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện cout
  4. Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện cout
  5. Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện - Giải phóng bộ nhớ trước khi kết thúc công việc với đối tượng đó. - Có tên trùng với hàm khởi tạo nhưng thêm dấu ~ trước tên hàm. - Không có tham số. - Trong chương trình chính ta không gọi hàm giải phóng nhưng hàm này vẫn được thực hiện. ~VD() { cout
  6. Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện Đối tượng làm tham số hàm, hàm trả về kiểu đối tượng Ví dụ: using namespace std; class VD{ private: int a,b; public: VD() { a=18; b=27; } VD(int x, int y) { a=x; b=y; } void show() { cout
  7. Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện VD o3; o3 = o1.add(o2); //o2.mul(o2); o3.show(); system("pause"); } 2.2 Nâng cao về lớp và đối tượng 2.2.1 Con trỏ đối tượng Chúng ta đã làm quen với mảng đối tượng và chúng ta cũng đã biết rằng có sự tương ứng 1-1 giữa mảng và con trỏ. Trong phần này, chúng ta sẽ thảo luận về con trỏ đối tượng. Việc khai báo con trỏ đối tượng hoàn toàn tương tự như khai báo con trỏ dữ liệu. Humans *man; Để truy cập đến các phương thức thành viên bên ngoài lớp (hàm thành viên), ta sử dụng dấu ->. Khi gọi phương thức khởi tạo, ta có thể gọi theo cách mà ta đã sử dụng cho con trỏ dữ liệu. Hoặc bạn có thể sử dụng toán tử new. Chương trình Kết quả … int main() Andy, 22 Jack, 21 { Humans man(“Andy”, 22); Humans *man0 = &man; //Hoặc Humans *man1 = new Humans(“Jack”, 21); cout
  8. Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện x.y thành viên y của đối tượng x x->y thành viên y của đối tượng trỏ bởi x (*x).y thành viên y của đối tượng trỏ bởi x x[i] đối tượng thứ i trỏ bởi x 2.2.2 Con trỏ this Từ khoá this ở bên trong một lớp đại diện cho đối tượng của lớp đó đang được thực hiện trong bộ nhớ. Nó là một con trỏ luôn có giá trị là địa chỉ của đối tượng. Nó có thể được dùng để kiểm tra xem tham số được truyền cho một hàm thành viên có phải chính bản thân đối tượng hay không. Ví dụ: class myClass { int a,b; int add(int a, int b) { this.a=a;//a là tham số của phương thức, this.a là thành viên lớp this.b=b; return this.a+this.b; } } 2.2.3 Thành viên tĩnh Một lớp có thể chứa các thành viên tĩnh, cả dữ liệu và các hàm. Các dữ liệu tĩnh còn được gọi là "biến của lớp" vì nội dung của chúng không phụ thuộc vào một đối tượng nào. Chỉ có một giá trị duy nhất cho tất cả các đối tượng trong cùng một lớp. Ví dụ, nó có thể được trong trường hợp bạn muốn có một biến chứa số đối tượng thuộc lớp đã được khai báo: 45 Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
  9. Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện 2.3 Nạp chồng Nạp chồng là một đặc tính quan trọng của C++ đó là cơ chế giúp bạn thực hiện tính đa hình trong lập trình hướng đối tượng. Có hai kiểu nạp chồng được cung cấp trong C++ đó là nạp chồng hàm và nạp chồng toán tử. Vậy thì hai kiểu nạp chồng này là gì, hoạt động như thế nào hôm nay chúng ta sẽ đi tìm hiểu về 2 hình thức nạp chồng này. 2.3.1 Nạp chồng phương thức Là một cơ chế của C++ cho phép chúng ta định nghĩa và sử dụng các hàm cùng tên, miễn là khác kiểu tham số hoặc là số lượng tham số khác nhau. Các hàm sử dụng cùng tên gọi là hàm chồng. Nạp chồng với kiểu tham số khác nhau Trong trường hợp này, các hàm có cùng số lượng tham số nhưng kiểu của tham số là khác nhau. Trình biên dịch sẽ dựa trên kiểu đối số của hàm để xác định hàm tương ứng. Ví dụ: class myClass { void hello(int a) // hàm này với tham số truyền vào là kiểu nguyên 46 Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
  10. Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện { cout
  11. Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện class myClass { public:int add(int a=0, int b=0, int c=0) {return a+b+c;} }; int main() { myClass obj1; cout
  12. Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện 2. Không thể thay đổi thứ tự ưu tiên của các toán tử 3. Không thể thay đổi số lượng toán hạng 4. Toán tử > đã được nạp chồng rồi để thực hiện nhập/xuất 5. Hàm toán tử không được chứa tham số mặc định Nạp chồng toán tử hai ngôi Khi nạp chồng toán tử hai ngôi hàm toán tử sẽ chỉ có một tham số duy nhất. Tham số này sẽ nhận một đối tượng là toán hạng nằm bên phải của toán tử (phép toán). Ví dụ: // vidu.cpp : main project file. #include "stdafx.h" #include using namespace std; class phanso { public:int tu,mau; public: phanso(){}; public: phanso(int a, int b) { tu=a;mau=b;} void show() { cout
  13. Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện phanso p1(1,2),p2(3,4),p3; p3=p1+p2; p3.show(); system("pause"); } Nạp chồng toán tử một ngôi Nạp chồng toán tử một ngôi cũng giống như đối với toán tử hai ngôi. Tuy nhiên toán tử một ngôi chỉ có một toán hạng và do đó hàm toán tử không có tham số. Ví dụ: // vidu.cpp : main project file. #include "stdafx.h" #include using namespace std; class phanso { public:int tu,mau; public: phanso(){}; public: phanso(int a, int b) { tu=a;mau=b; } void show() { cout
  14. Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện tu++; mau++; return *this; } }; int main() { phanso p1(1,2),p2(3,4),p3; p3=p1+p2;// Nạp chồng toán tử 2 ngôi p3.show(); // p3++;//Nạp chồng toán tử 1 ngôi p3.show(); system("pause"); } Nạp chồng toán tử so sánh và toán tử logic Như bạn đã biết biểu thức a>b trả về true nếu a lớn hơn b, false nếu a nhỏ hơn b. Trong C++ giá trị false tương ứng với 0, giá trị true tương ứng với một số nguyên khác 0. Do đó người ta thường sử dụng kiểu giá trị trả về của các hàm toán tử (khi chồng toán tử so sánh và toán tử logic) là kiểu số nguyên. Ví dụ: #include "stdafx.h" #include using namespace std; class phanso { public:int tu,mau; public: phanso(){}; public: phanso(int a, int b) { tu=a;mau=b; } void show() 51 Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
  15. Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện { cout
  16. Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện p3=p1+p2; p3.show(); // p3++; p3.show(); // if(p1>p2){cout
  17. Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện Kế thừa kiểu public: class lop_con: public lop_cha{ } Đây là kiểu kế thừa chúng ta hay dùng nhất. Với kiểu kế thừa này, các đối tượng của lớp con có thể truy cập vào các thành viên public và protected của lớp cha. Các thành viên protected của lớp cha sẽ trở thành thành viên protected của lớp con và các thành viên public của lớp cha trở thành thành viên public của lớp con. Kế thừa kiểu private: class lop_con: private lop_cha{ } Đối với kiểu kế thừa này, tất cả các thành viên của lớp cha (trừ các thành viên có mức độ truy cập private) sẽ trở thành các thành viên private của lớp con và chỉ có thể được sử dụng bởi các phương thức trong lớp con. Kế thừa kiểu protected: class lop_con: protected lop_cha{ } Đối với kiểu kế thừa này, tất cả các thành viên của lớp cha (trừ các thành viên có mức độ truy cập private) sẽ trở thành các thành viên protected của lớp con và có thể được sử dụng bởi các phương thức trong lớp con và các đối tượng của nó. Có thể tóm tắt lại các kiểu kế thừa như sau: - Cột: các kiểu kế thừa - Hàng: phạm vi các biến/phương thức thành phần trong lớp cha - Kết quả: phạm vi các biến/phương thức trong lớp con 2.4.3 Kế thừa với hàm tạo và hàm hủy Tất cả các lớp cha và lớp con đều có thể có hàm tạo và hàm hủy. Nếu cả lớp cha và lớp con đều có hàm tạo, hàm hủy thì hàm tạo của lớp cha sẽ được thực hiện trước hàm tạo của lớp con khi một đối tượng của lớp con được tạo ra. Điều này ngược lại 54 Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
  18. Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện với hàm hủy. Tức là, hàm hủy của lớp con sẽ được thực hiện trước hàm hủy của lớp cha. Ví du: #include "stdafx.h" #include using namespace System; using namespace std; class cha { int a,b; public: cha() { cout
  19. Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện Day la phuong thuc khoi tao cua lop cha Day la phuong thuc khoi tao cua lop con Ham huy cua lop con ham huy cua lop cha 2.4.4 Phương thức ảo Phương thức ảo cũng giống như một phương thức thành viên khác của lớp. Trên thực tế, phương thức ảo là một phương thức thành viên được khai báo trong lớp cha và sẽ được định nghĩa lại trong các lớp con kế thừa nó. Khi một lớp chứa phương thức ảo được kế thừa bởi một lớp khác, nói chung phương thức này phải được định nghĩa lại cho mục đích riêng của lớp kế thừa. Phương thức ảo được tạo bằng cách đặt từ khóa virtual ngay trước khai báo phương thức. Khi hàm ảo được định nghĩa lại trong lớp con, ta không cần sử dụng từ khóa virtual. Ta có cú pháp khai báo hàm ảo như sau: 56 Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
  20. Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện class lop_cha { //các thành phần của lớp //Khai báo hàm ảo có tên là ham_ao, có kiểu trả về là int và không có tham số Public: virtual int ham_ao() { } }; class lop_con : public lop_cha { //các thành phần khác của lớp //định nghĩa lại hàm ảo được kế thừa ở lớp cha Public: int ham_ao() { //nội dung định nghĩa lại hàm ảo } }; 2.4.5 Lớp trừu tượng Một lớp cơ sở trừu tượng là một lớp chỉ được dùng làm cơ sở cho các lớp khác. Không hề có đối tượng nào của một lớp trừu tượng được tạo ra cả, bởi vì nó chỉ được dùng để định nghĩa một số khái niệm tổng quát, chung cho các lớp khác. Một ví dụ về lớp trừu tượng là lớp CON_VAT (con vật), nó sẽ dùng làm cơ sở để xây dựng các lớp con vật cụ thể như lớp CON_CHO (con chó), CON_MEO (con mèo),... (xem ví dụ bên dưới) Trong C++ , thuật ngữ “Lớp trừu tượng” đặc biệt áp dụng cho các lớp có chứa các phương thức ảo thuần tuý. Phương thức ảo thuần tuý là một phương thức ảo mà nội dung của nó không có gì. Cách thức định nghĩa một phương thức ảo thuần tuý như sau: virtual void tên_phương_thức() = 0 ; Ví dụ: class A { 57 Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2