Tìm hiểu lập trình hướng đối tượng với c++

66 247 0
  • Loading ...
1/66 trang

Thông tin tài liệu

Ngày đăng: 07/02/2017, 22:16

Tìm hiểu lập trình hướng đối tượng với c++ TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN ĐIỆN TỬ VIỄN THÔNG - - ĐỒ ÁN Chủ đề: Xử Lí Ảnh Phần 1: Tìm hiểu lập trình hướng đối tượng với C++ Hà Nội, tháng 09/2016 TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Lập trình hướng đối tượng với C++ VIỆN ĐIỆN TỬ VIỄN THÔNG ********* ĐỒ ÁN Chủ đề: Xử Lí Ảnh Phần 1: Tìm hiểu lập trình hướng đối tượng với C++ Hà Nội, tháng 09/2016 Lập trình hướng đối tượng với C++ Mục lục Lập trình hướng đối tượng với C++ Lập trình hướng đối tượng C++ 1.1 Mục tiêu Giúp người đọc hiểu lập trình hướng đối tượng ngôn ngữ lập trình C++ 1.2 Các khái niệm lập trình hướng đối tượng 1.2.1 Khái niệm lập trình hướng đối tượng Khái niệm hướng đối tượng xây dựng tảng khái niệm lập trình có cấu trúc trừu tượng hóa liệu Sự thay đổi chỗ, chương trình hướng đối tượng thiết kế xoay quanh liệu mà làm việc đó, theo thân chức chương trình Điều hoàn toàn tự nhiên hiểu mục tiêu chương trình xử lý liệu Lập trình hướng đối tượng cho phép tổ chức liệu chương trình theo cách tương tự nhà sinh học tổ chức loại thực vật khác Theo cách nói lập trình đối tượng, xe hơi, cối, số phức, sách gọi lớp (Class) Một lớp mẫu mô tả thông tin cấu trúc liệu, lẫn thao tác hợp lệ phần tử liệu Khi phần tử liệu khai báo phần tử lớp gọi đối tượng (Object) Các hàm định nghĩa hợp lệ lớp gọi phương thức (Method) chúng hàm xử lý liệu đối tượng lớp Mộtthực thể (Instance) vật thể có thực bên nhớ, thực chất đối tượng (nghĩa đối tượng cấp phát vùng nhớ) 1.2.2 Khái niệm đóng gói Sự đóng gói chế ràng buộc liệu thao tác liệu thành thể thống nhất, tránh tác động bất ngờ từ bên Thể thống gọi đối tượng Trong đối tượng, liệu hay thao tác hay hai riêng (Private) chung (Public) đối tượng Thao tác hay liệu riêng thuộc đối tượng truy cập thành phần đối tượng, điều nghĩa thao tác hay liệu riêng truy cập phần khác chương trình tồn đối tượng Khi thao tác hay liệu chung, phần khác chương trình truy cập nó định nghĩa đối tượng Các thành phần chung đối tượng dùng để cung cấp giao diện có điều khiển cho thành thành riêng đối tượng Lập trình hướng đối tượng với C++ 1.2.3 Khái niệm tính kế thừa Chúng ta xây dựng lớp từ lớp cũ thông qua kế thừa Một lớp gọi lớp dẫn xuất (derived class), thừa hưởng liệu phương thức lớp sở (base class) ban đầu Trong lớp này, bổ sung thành phần liệu phương thức vào thành phần liệu phương thức mà thừa hưởng từ lớp sở Mỗi lớp (kể lớp dẫn xuất) có số lượng lớp dẫn xuất Qua cấu kế thừa này, dạng hình lớp hình thành Dạng lớp trông giống gia phả lớp sở gọi lớp cha (parent class) lớp dẫn xuất gọi lớp (child class) 1.2.4 Khái niệm tính đa hình Đó khả thông điệp thay đổi cách thực theo lớp cụ thể đối tượng nhận thông điệp Khi lớp dẫn xuất tạo ra, thay đổi cách thực phương thức mà thừa hưởng từ lớp sở Một thông điệp gởi đến đối tượng lớp sở, dùng phương thức định nghĩa cho lớp sở Nếu lớp dẫn xuất định nghĩa lại phương thức thừa hưởng từ lớp sở thông điệp có tên với phương thức này, gởi tới đối tượng lớp dẫn xuất gọi phương thức định nghĩa cho lớp dẫn xuất 1.3 C++ Căn 1.3.1 Cấu trúc chương trình C++ Đâu tiên, có hàm main int main() Sau đó, có phần thân hàm main cặp dấu ngoặc nhọn đứng sau từ khóa main, cuối thân hàm mainlà giá trị trả hàm main int main() { return 0; } Tiếp đến, có dòng lệnh đặt bên thân hàm main int main() { cout > var_1 >> var_2 >> … >> var_n; coi ký tự trắng ký tự phân cách lần nhập liệu Các ký tự trắng (white space characters) bao gồm: dấu cách, dấu tab, ký tự xuống dòng (new line) Ví dụ a, b hai biến kiểu int, câu lệnh: cin >> a >> b; Lập trình hướng đối tượng với C++ 1.4 Đối tượng Lớp 1.4.1 Đối tượng (Objects) Khi thiết kế chương trình theo tư hướng đối tượng người ta không hỏi “vấn đề chia thành hàm nào” mà “vấn đề giải cách chia thành đối tượng nào” Tư theo hướng đối tượng làm cho việc thiết kế “tự nhiên” trực quan Điều xuất phát từ việc lập trình viên cố gắng tạo phong cách lập trình giống đời thực tốt Tất thứ trở thành đối tượng OOP, có giới hạn trí tưởng tượng bạn Đối tượng thực thể tồn chương trình chạy Nó có thuộc tính (Attributes) phương trức (Methods) riêng 1.4.2 Lớp (Class) - Định nghĩa lớp: Các class tạo cách sử dụng từ khóa class Chúng ta xem xét ví dụ định nghĩa lớp Giả sử lập lớp Student lưu trữ thông tin sinh viên chứa hàm để thao tác liệu 10 11 12 13 14 15 16 17 18 19 20 21 #include #include using namespace std; // class definition class Student{ private: string name; // tên sinh viên int age; // tuổi string student_code; // mã số sinh viên public: // set information void set_name(string); // nhập tên void set_age(int); // nhập tuổi void set_student_code(string); // nhập mã sinh viên // get information string get_name(); // lấy tên int get_age(); // lấy tuổi string get_student_code(); // lấy mã sinh viên }; Ta phân tích định nghĩa lớp Student Đầu tiên từ khóa class, sau tên lớp mà người dùng muốn tạo (ở Student) Phần lại nằm cặp ngoặc móc {}chứa thành lớp Những liệu như: name, age, Lập trình hướng đối tượng với C++ student_code gọi thành phần liệu (data members), hàm như: set_name(), get_name(), … gọi hàm thành viên (member functions) hay phương thức (methods) Thông thường data members để chế độ private, member functions chế độpublic Từ khóa private public hai access-specifier quy định quyền truy nhập thành phần lớp, có hiệu lực cho thành phần lớp đứng sau gặp access-specifier khác Tất thành phần khai báo public truy cập “thoải mái” chỗ lớp có hiệu lực Ví dụ truy cập hàm thành viên của lớp khác, hàm tự chương trình Các thành phần private bảo mật cao Chỉ thành phần lớp truy nhập đến chúng Mọi cố gắng truy nhập bất hợp pháp từ bên gây lỗi Do ta mô tả cú pháp chung để định nghĩa lớp sau: class Class_name{ private: // thành phần private public: // thành phần public }; - Định nghĩa hàm thành viên cho lớp: Trong định nghĩa lớp khai báo nguyên mẫu hàm (function prototypes) hoàn toàn chưa có thân hàm Ta phải định nghĩa hàm Có hai cách định nghĩa hàm thành viên: định nghĩa hàm thành viên định nghĩa lớp khai báo nguyên mẫu lớp, định nghĩa bên lớp Định nghĩa hàm định nghĩa lớp Khi định nghĩa lớp viết lại sau: class Student{ private: string name; int age; string student_code; public: // set information void set_name(string str){ name=str; } void set_age(int num){ age=num; } Lập trình hướng đối tượng với C++ 10 11 12 13 14 15 16 }; void set_student_code(string str){ student_code=str; } // get information string get_name(){ return name; } int get_age(){ return age; } string get_student_code(){ return student_code; }; Ta nhận thấy hàm định nghĩa nghĩa lớp Tuy nhiên cách cách tốt Với hàm đơn giản, ngắn Nhưng thực tế ta xây dựng lớp lớp phức tạp số lượng hàm nhiều dài Nếu định nghĩa lớp làm “mất mĩ quan” khó kiểm soát Vì định nghĩa lớp ta liệt kê nguyên mẫu hàm, định nghĩa, ta định nghĩa bên Khai báo hàm lớp, định nghĩa lớp // class definition class Student{ private: string name; int age; string student_code; public: // set information void set_name(string); 10 void set_age(int); 11 void set_student_code(string); 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 // get information string get_name(); int get_age(); string get_student_code(); }; // member function definitions // set name void Student::set_name(string str){ name=str; } // set age void Student::set_age(int num){ age=num; } // set student code 10 Lập trình hướng đối tượng với C++ 17 // 18 foo(&doSomething, 0); 19 // 20 } - Lập lịch thao tác với vector trỏ hàm Con trỏ hàm xét cho trỏ, nên ta sử dụng kiểu tổ chức liệu mảng, cây, danh sách liên kết… để lưu trữ xử lý hàm phần tử đơn Ở nói cách tổ chức trỏ hàm với vector Chúng ta xét ví dụ sau, giả sử Button cần xử lý hàm thefunc1 thefunc2 sau theo thứ tự int thefunc1(int a) { return a++; } int thefunc2(int a) { return a + 3; 10 } Vậy trường hợp này, ta viết lớp Button sử dụng sau: class Button { public: Button() 52 Lập trình hướng đối tượng với C++ { func1 = &thefunc1; func2 = &thefunc2; } ~Button(){}; 10 int Action(int a) 11 { return (*func1)(a) + (*func2)(a); 12 13 } 14 private: 15 int (*func1)(int); 16 int (*func2)(int); 17 }; 18 19 20 int main() 21 { 22 Button b1; 23 b1.Action(3); 24 return 0; 25 } Ta thấy button b1 gán vào hàm xử lý bên (thefunc1 thefunc2) Tuy nhiên button có hàm xử lý, ta phải tìm phương pháp tổ chức trỏ hàm hợp lý hơn, tổng quát cho trường hợp Button có số hàm xử lý không xác định Sau chỉnh sửa, ta có đoạn chương trình sau: 53 Lập trình hướng đối tượng với C++ #include // class Button { public: Button(){}; ~Button(){}; 10 void Add(func f) 11 { functions.push_back(f); 12 13 } 14 int Action(int a) 15 { 16 int result; 17 for(int i = 0; i < functions.size(); ++i) result += (*functions[i])(a); 18 return result; 19 20 } 21 private: 22 std::vector functions; 23 }; 24 54 Lập trình hướng đối tượng với C++ 25 int main() 26 { 27 Button b1; 28 b1.Add(&thefunc1); 29 b1.Add(&thefunc2); 30 b1.Action(3); 31 } Vậy với lớp Button này, ta thêm vào danh sách thao tác đối tượng kiểu Button số lượng hàm tùy ý, tất nhiên, hàm phải có kiểu trả danh sách đối số với trỏ hàm - Con trỏ hàm lập trình hướng đối tượng Trong OOP, vấn đề khởi tạo sử dụng trỏ hàm có phần phức tạp lập trình hướng thủ tục có vấn đề tầm vực hàm hàm phải gọi thông qua đối tượng lớp Nói phần này, có ví dụ sau: #include using namespace std; class Default { public: int Sum(int a,int b) { return a + b; 10 } 11 }; 55 Lập trình hướng đối tượng với C++ 12 13 class Function 14 { 15 typedef int (Default::*func)(int, int); 16 public: 17 func p; 18 Function(func fun, Default* object) 19 { 20 this->p = fun; 21 Obj = object; 22 } 23 ~Function(){} 24 int Action(int a, int b) 25 { return (Obj->*p)(a, b); 26 27 } 28 private: 29 Default* Obj; 30 }; 31 32 int main() 33 { 34 Default k; 35 Function* f; 56 Lập trình hướng đối tượng với C++ 36 f = new Function(&Default::Sum, &k); 37 cout Action(5, 6); 38 getchar(); 39 return 0; 40 } Những điều bạn cần ý là: Con trỏ kiểu Default* hàm tạo Function Hàm Action Function Chức trỏ kiểu Default lớp Function nhằm xác định đối tượng gọi đến hàm Sum lớp Default, ta thấy rõ việc hàm Action lớp Function Không thông thường, hàm Sum gọi đến cách sau: (Obj->*p)(a,b); Với p trỏ trỏ đến hàm Sum, Obj trỏ trỏ đến đối tượng k thuộc lớp Default Cách gọi tư tưởng tương đương với: k->Sum(a, b); 1.9 Struct Một struct (viết tắt structure) cho phép nhóm nhiều biến nhiều kiểu liệu khác để lưu trữ tập hợp liệu cần thiết cho việc mô tả đơn vị 1.9.1 Khai báo struct Để khai báo cấu trúc (kiểu liệu mới), sử dụng từ khóa struct Mặc dù struct kiểu liệu lập trình viên tự định nghĩa, cần khai báo theo cú pháp định để compiler hiểu Dưới cú pháp để tạo struct mới: struct { ; }; Trong đó: 57 Lập trình hướng đối tượng với C++ - - struct từ khóa mà ngôn ngữ C++ cung cấp name_of_new_type tên kiểu liệu Sau khai báo xong struct, dùng tên struct để khai báo biến kiểu liệu thông thường variables danh sách biến dùng để lưu trữ liệu phù hợp với yêu cầu lưu trữ liệu đơn vị Ví dụ: #include #include struct VietNamPeople { int32 ID; std::string name; int16 age; float height; float weight; bool isStudent; }; Như vậy, vừa định nghĩa xong struct có tên VietNamPeople, struct coi kiểu liệu tập hợp biến ID, name, age, height, weight isStudent Những biến đặt vào chung nhóm biến lưu trữ phần thông tin đơn vị người Việt Nam Khi biến đặt struct, gọi chúng trường liệu struct (fields) Một trường liệu thành phần tập hợp biến lưu trữ liệu cần thiết cho đơn vị Ví dụ kiểu liệu VietNamPeople có trường liệu ID, name, age, height, weight isStudent Compiler hiểu biến tạo từ kiểu liệu VietNamPeople, ví dụ: VietNamPeople leTranDat; lúc này, leTranDat tên đơn vị tạo thành từ tập hợp trường liệu ID, name, age, height, weight isStudent mà định nghĩa cho kiểu liệu VietNamPeople Các bạn hình dung này: 58 Lập trình hướng đối tượng với C++ Đây hình ảnh minh họa cho việc tổ chức liệu trường bên biến kiểu VietNamPeople sau tạo Trên thực tế trường có kích thước khác so với dự đoán (khi đến phần nâng cao struct trình bày vấn đề này), bạn học chưa cần quan tâm điều Chúng ta sử dụng kiểu liệu VietNamPeople mà định nghĩa để tạo nhiều biến struct khác nhau: VietNamPeople leTranDat; VietNamPeople dayNhauHoc; VietNamPeople ngoDoanTuan; // Như biến thông thường, biến struct cấp phát nhớ tùy vào cách chọn kỹ thuật cấp phát 1.9.2 Khởi tạo cho biến struct Khởi tạo giá trị cho trường liệu biến struct rắc rối khởi tạo giá trị cho biến thông thường chút Ngôn ngữ C++ hổ trợ cho cách nhanh sử dụng initializer list Nó cho phép bạn khởi tạo nhiều trường liệu khai báo biến struct Ví dụ: struct Employee { int32 ID; std::string name; int32 age; int32 year_of_exp; }; // Employee leTranDat = { 1, "Le Tran Dat", 28, }; 59 Lập trình hướng đối tượng với C++ Các trường liệu khởi tạo từ xuống phần định nghĩa struct có tên Employee Lúc này, biến leTranDat chứa thông tin khởi tạo là: ID = 1, name = "Le Tran Dat", age = 28 vàyear_of_exp = Nếu initializer list không cung cấp đủ liệu cho trường liệu, giá trị mặc định dùng để khởi tạo Ví dụ: Employee newEmp = { 1, "new employee" }; //age = 0, year_of_exp = by default Một tập hợp giá trị biến struct gọi Record (bản ghi) 1.9.3 Truy cập trường liệu biến struct Xem xét struct Employee định nghĩa trên: struct Employee { int32 ID; std::string name; int32 age; int32 year_of_exp; }; Kiểu liệu Employee mô tả biến kiểu Employee tạo bao gồm trường liệu ID, name, age year_of_exp Như vậy, biến có kiểu Employee có đủ trường liệu Muốn truy xuất đến trường liệu biến struct, sử dụng member selection operator (dấu chấm) Dưới ví dụ: Employee leTranDat; leTranDat.ID = 1; leTranDat.name = "Le Tran Dat"; leTranDat.age = 28; leTranDat.year_of_exp = 5; Visual studio hổ trợ liệt kê tất trường liệu biến struct sử dụng member selection operator 60 Lập trình hướng đối tượng với C++ Các trường liệu biến struct biến thông thường, gói gọn bên biến struct, nên phải sử dụng tên biến struct member selection operator để truy xuất đến chúng Như vậy, thông qua tên biến struct, trường liệu nhóm lại giúp biết trường liệu dùng cho đơn vị nào, điều giúp dễ dàng tổ chức chương trình quy mô lớn Vì trường liệu biến struct biến thông thường, sử dụng chúng để tính toán, so sánh, Employee leTranDat = { 1, "Le Tran Dat", 28, }; Employee juniorEmp = { 2, "New employee", 25, }; if (leTranDat.year_of_exp > juniorEmp.year_of_exp) { std::cout [...]... height int Rectangle::get_height(){ 13 Lập trình hướng đối tượng với C++ 41 42 43 44 45 46 47 return height; } // calculate area int Rectangle::area(){ return height*width; } Điều gì sẽ xảy ra khi ta gọi hàm tính diện tích area trước khi thiết lập chiều rộng và chiều cao cho hình chữ nhật như trong đoạn chương trình sau: 1 Rectangle my_rectangle; // khai báo đối tượng my_rectangle thuộc lớp Rectangle... tạo mặc định (hay ngầm định) Chúng ta xem xét chuyện gì sẽ 17 Lập trình hướng đối tượng với C++ xảy ra nếu như không có hàm tạo ngầm định khi khai báo một mảng các đối tượng Ví dụ vẫn là lớp Rectangle với hàm tạo hai tham số: 1 class Rectangle{ 2 private: 3 int width; 4 int height; 5 public: 6 // constructor 7 Rectangle(int, int); // hàm tạo với hai tham số 8 9 10 11 12 13 14 15 16 17 18 19 /* các hàm... chạy sai mới đểu) Truyền tham chiếu thông qua tham chiếu Tham chiếu (reference) là một khái niệm mới của C++ so với C Nói nôm na nó là một biệt danh hay nickname của một biến Chương trình sau minh họa đơn giản cách sử dụng tham chiếu trong C++ 1 #include 24 Lập trình hướng đối tượng với C++ 2 using namespace std; 3 4 int main(){ 5 int x; // khai báo biến nguyên x 6 int &ref=x; // tham chiếu... default_arg(2, 3) ... với C++ Mục lục Lập trình hướng đối tượng với C++ Lập trình hướng đối tượng C++ 1.1 Mục tiêu Giúp người đọc hiểu lập trình hướng đối tượng ngôn ngữ lập trình C++ 1.2 Các khái niệm lập trình hướng. . .Lập trình hướng đối tượng với C++ VIỆN ĐIỆN TỬ VIỄN THÔNG ********* ĐỒ ÁN Chủ đề: Xử Lí Ảnh Phần 1: Tìm hiểu lập trình hướng đối tượng với C++ Hà Nội, tháng 09/2016 Lập trình hướng đối tượng. .. hướng đối tượng 1.2.1 Khái niệm lập trình hướng đối tượng Khái niệm hướng đối tượng xây dựng tảng khái niệm lập trình có cấu trúc trừu tượng hóa liệu Sự thay đổi chỗ, chương trình hướng đối tượng
- Xem thêm -

Xem thêm: Tìm hiểu lập trình hướng đối tượng với c++, Tìm hiểu lập trình hướng đối tượng với c++, Tìm hiểu lập trình hướng đối tượng với c++, Lập trình hướng đối tượng C++

Mục lục

Gợi ý tài liệu liên quan cho bạn

Nhận lời giải ngay chưa đến 10 phút Đăng bài tập ngay