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

Lập trình ứng dụng trong kỹ thuật - Cơ Điện Tử - Chương 3

Chia sẻ: Trương Đăng Khoa | Ngày: | Loại File: PDF | Số trang:19

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

Tham khảo tài liệu 'lập trình ứng dụng trong kỹ thuật - cơ điện tử - chương 3', kỹ thuật - công nghệ, cơ khí - chế tạo máy phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả

Chủ đề:
Lưu

Nội dung Text: Lập trình ứng dụng trong kỹ thuật - Cơ Điện Tử - Chương 3

  1. Lập trình ứng dụng trong kỹ thuật Chương 3 TÓM TẮT CHƢƠNG 3 : C++/CLI HƢỚNG ĐỐI TƢỢNG. PHẦN A : GIỚI THIỆU TỔNG QUAN 1) Tổng quan về các phƣơng pháp lập trình : a) Lập trình tuyến tính : Đây là phương pháp lập trình ra đời đầu tiên. Đặc trưng cơ bản của lập trình tuyến tính là tu duy theo lối tuần tự : chương trình được thực hiện từ đầu đến cuối, lệnh này kế tiếp lệnh kia cho đến khi kết thúc chương trình. Đặc trưng của lập trình tuyến tính :  Đơn giản : lập trình theo lối tuần tự, không phức tạp.  Đơn luồng : chỉ có một luông công việc được thực hiện tuần tự. Nhược điểm :  Không thể thực hiện được các chương trình phức tạp.  Chương trình dài. b) Lập trình cấu trúc : Trong lập trình cấu trúc, chương trình chính được chia nhỏ thành các chương trình con, mỗi chương trình con thực hiện một công việc xác định (chương trình con chính là các hàm). Chương trình sẽ gọi đến chương trình con bằng một giải thuật hay một cú pháp nhất định trong chương trình. Một chương trình con có thể được gọi nhiều lần trong chương trình chính. Đặc trưng của lập trình cấu trúc  Chương trình bao gồm hai thành phần chính : cấu trúc dữ liệu và giải thuật. Cấu trúc dữ liệu là cách thức tổ chức dữ liệu, cách mô tả bài toán dưới dạng ngôn ngữ lập trình. Giải thuật là qui trình để thực hiện bài toán đó.  Giải thuật luôn luôn phụ thuộc vào cấu trúc dữ liệu. Nhược điểm :  Không hỗ trợ việc sử dụng lại mã nguồn do giải thuật luôn phụ thuộc vào cấu trúc dữ liệu. Khi thay đổi cấu trúc dữ liệu thì đồng thời phải thay đổi luôn cả giải thuật. c) Lập trình hướng đối tượng : Lập trình hướng đối tượng ra đời nhằm khắc phục các hạn chế của lập trình cấu trúc. Lập trình hướng đối tượng được xây dựng trên cơ sở các đối tượng. Những đối tượng trong một ngôn ngữ hướng đối tượng là các kết hợp giữa mã và dữ liệu mà chúng được nhìn nhận như là một đơn vị duy nhất. Mỗi đối tượng có một tên riêng biệt và tất cả các tham chiếu đến đối tượng đó được tiến hành qua tên của nó. Như vậy, mỗi đối tượng có khả năng nhận vào các thông báo, xử lý dữ liệu (bên trong của nó), và gửi ra hay trả lời đến các đối tượng khác hay đến môi trường. Bộ môn Cơ điện tử Trang 1
  2. Lập trình ứng dụng trong kỹ thuật Chương 3 VD : Chuỗi kí tự trong C++/CLI là một dạng đối tượng. Khi chúng ta khai báo String^ a = “Hello” tức là đã tạo ra một đối tượng. Đối tượng này có tên là a, ta có thể tiến hành các tham chiếu thông qua tên của đối tượng : a->Length ; a->Substring() … 2) Lập trình hƣớng đối tƣợng: Lập trình hƣớng đối tƣợng (gọi tắt là OOP, từ chữ Anh ngữ object-oriented programming), hay còn gọi là lập trình định hƣớng đối tƣợng, là kĩ thuật lập trình hỗ trợ công nghệ đối tượng. Một cách giản lược, đây là khái niệm và là một nỗ lực nhằm giảm nhẹ các thao tác viết mã cho người lập trình, cho phép họ tạo ra các ứng dụng mà các yếu tố bên ngoài có thể tương tác với các chương trình đó giống như là tương tác với các đối tượng vật lý. Những đối tượng trong một ngôn ngữ OOP là các kết hợp giữa mã và dữ liệu mà chúng được nhìn nhận như là một đơn vị duy nhất. Mỗi đối tượng có một tên riêng biệt và tất cả các tham chiếu đến đối tượng đó được tiến hành qua tên của nó. Như vậy, mỗi đối tượng có khả năng nhận vào các thông báo, xử lý dữ liệu (bên trong của nó), và gửi ra hay trả lời đến các đối tượng khác hay đến môi trường. a) Các tính chất : Đối tƣợng (object): Các dữ liệu và mã lệnh được kết hợp vào một đơn vị đầy đủ tạo nên một đối tượng. Đơn vị này tương đương với một chương trình con và vì thế các đối tượng sẽ được chia thành hai bộ phận chính: phần các phƣơng thức (method) và phần các thuộc tính (attribute). Trong thực tế, các phƣơng thức của đối tượng là các hàm và các thuộc tính của nó là các biến, các tham số hay hằng nội tại của một đối tượng (hay nói cách khác tập hợp các dữ liệu nội tại tạo thành thuộc tính của đối tượng). Các phƣơng thức là phương tiện để sử dụng một đối tượng trong khi các thuộc tính sẽ mô tả đối tượng có những tính chất gì. Các phương thức và các thuộc tính thường gắn chặt với thực tế các đặc tính và sử dụng của một đối tượng. VD : Trong bài toán quản lí Sinh viên ở trường Đại học thì mỗi Sinh viên có thể được xem là một đối tượng. Các Sinh viên sẽ được phân biệt với nhau thông qua Họ tên. Mỗi Sinh viên lại được mô tả bởi Ngày sinh, Nơi sinh, MSSV, Ngành học, Điểm số … ; đây chính là các thuộc tính của đối tượng Sinh viên. Người quản lí muốn tác động đến thông tin của một Sinh viên nào đó thì phải thông qua các phương thức của đối tượng Sinh viên như : Xem ngày sinh, Xem nơi sinh, Nhập điểm số, Xem điểm số, Sửa điểm số … Trong thực tế, các đối tượng thường được trừu tượng hóa qua việc định nghĩa của các lớp (class). Tập hợp các giá trị hiện có của các thuộc tính tạo nên trạng thái của một đối tượng. Mỗi phƣơng thức hay mỗi dữ liệu nội tại cùng với các tính chất được định nghĩa (bởi người lập trình) được xem là một đặc tính riêng của đối tượng. Nếu không có gì lầm lẫn thì tập hợp các đặc tính này gọi chung là đặc tính của đối tượng. Tính đóng gói (Encapsulation) : Bộ môn Cơ điện tử Trang 2
  3. Lập trình ứng dụng trong kỹ thuật Chương 3 Các đối tượng có những thuộc tính tương tự nhau được gom thành một nhóm (lớp). Các thuộc tính chung nhất của các đối tượng sẽ được giữ lại và các thuộc tính chung này sẽ trở thành các thuộc tính của lớp. VD : trong nhóm các đối tượng là phương tiện giao thông, nếu chúng ta nhóm các đối tượng có chung thuộc tính là : 2 bánh, có động cơ … thì chúng ta sẽ có nhóm xe máy. Nếu chúng ta nhóm các đối tượng có chung thuộc tính là : có 4 bánh, có động cơ … thì chúng ta sẽ có nhóm xe ôtô. Trong nhóm xe máy, có xe có gương chiếu hậu, có xe không có, như vậy gương chiếu hậu không phải là thuộc tính chung và không được xem là thuộc tính của nhóm. Việc truy xuất đến các dữ liệu được thực hiện thông qua các phương thức được trang bị cho nhóm. Nếu người sử dụng muốn thay đổi các thay đổi trạng thái của đối tượng thì bắt buộc phải thông qua các phương thức này. Việc cho phép môi trường bên ngoài tác động lên các dữ liệu nội tại của một đối tượng theo cách nào là hoàn toàn tùy thuộc vào người viết mã. Tính chất này không cho phép người sử dụng các đối tượng thay đổi trạng thái nội tại của một đối tượng. Tính thừa kế (Inheritance) : Các lớp được tổ chức theo sơ đồ cây phân cấp. Lớp cơ sở đầu tiên được gọi là lớp gốc (Root Class). Lớp phía trên được gọi là lớp cha hay lớp cơ sở. Lớp phía dưới được gọi là lớp con hay lớp dẫn xuất. Lớp con có khả năng kế thừa các thuộc tính và phương thức của lớp cha. Như vậy, khi định nghĩa một lớp mới là lớp con của một lớp cơ sở, ta không phải định nghĩa và xây dựng lại các thuộc tính và phương thức đã xây dựng cho lớp cơ sở thay vì phải xây dựng lại (đây chính là khả năng sử dụng lại mã nguồn). VD : trong lớp các xe gắn máy, có thể chia ra hai lớp con là lớp xe tay ga và lớp xe số. Trong lớp xe gắn máy có các thuộc tính như màu sơn, nhãn hiệu … thì lớp xe tay ga có quyền kế thừa các thuộc tính này của lớp cha. Tính đa hình (Polymorphism) : Các lớp dẫn xuất có cùng một lớp cơ sở nhưng cũng có những thuộc tính khác hẳn nhau. Trong cùng một lớp cha, nếu ta gọi ra một phương thức nhưng nếu là từ các đối tượng thuộc các lớp con khác nhau thì sẽ được các kết quả khác nhau. VD : lớp cơ sở Human có hai lớp con là Student và Public Servant. Trong lớp cơ sở có định nghĩa một phương thức là Show(). Nếu sử dụng phương thức này đối với đối tượng thuộc lớp Human sẽ cho biết số CMND của đối tượng. Nếu sử dụng phương thức này đối với đối tượng thuộc Student sẽ cho biết MSSV. Nếu sử dụng phương thức này đối với đối tượng thuộc lớp Public Servant sẽ cho biết Mã số công chức. Bộ môn Cơ điện tử Trang 3
  4. Lập trình ứng dụng trong kỹ thuật Chương 3 b) Các khái niệm cơ bản : Lớp (Class) : Một lớp có thể được hiểu là khuôn mẫu để tạo ra các đối tượng. Trong một lớp, người ta thường dùng các biến để mô tả các thuộc tính và các hàm để mô tả các phương thức của đối tượng. Khi đã định nghĩa được lớp, ta có thể tạo ra các đối tượng từ lớp này. Để việc sử dụng được dễ dàng, thông qua hệ thống hàm tạo (constructor), người ta dùng lớp như một kiểu dữ liệu để tạo ra các đối tượng. Nói tóm lại, lớp luôn luôn được đặc trưng bởi các thuộc tính và phương thức. Lớp con (subclass) Lớp con là một lớp thông thường nhưng có thêm tính chất kế thừa một phần hay toàn bộ các đặc tính của một lớp khác. Lớp mà có các tính chất được lớp con kế thừa gọi là Lớp cha (parent class). Lớp trừu tƣợng (abstract class) Lớp trừu tượng là lớp mà ta không thể thực thể hóa thành đối tượng (tạo ra đối tượng). Thuộc tính (attribute) Thuộc tính của một lớp bao gồm các biến, các hằng, hay tham số nội tại của lớp đó. Ở đây, vai trò quan trọng nhất của các thuộc tính là các biến vì chúng sẽ có thể bị thay đổi trong suốt quá trình hoạt động của một đối tượng. Các thuộc tính có thể được xác định kiểu và kiểu của chúng có thể là các kiểu dữ liệu cổ điển hay đó là một lớp đã định nghĩa từ trước. Phƣơng thức (method) Phương thức của một lớp thường được dùng để mô tả các hành vi của đối tượng (hoặc của lớp). Mỗi phương thức thường được định nghĩa là một hàm, các thao tác để thực hiện hành vi đó được viết tại nội dung của hàm. Người ta còn định nghĩa thêm vài loại phương thức đặc biệt:  Hàm tạo (constructor) là hàm được dùng để tạo ra một đối tượng, cài đặt các giá trị ban đầu cho các thuộc tính của đối tượng đó.  Hàm hủy (destructor) là hàm dùng vào việc làm sạch bộ nhớ đã dùng để lưu đối tượng và hủy bỏ tên của một đối tượng sau khi đã dùng xong, trong đó có thể bao gồm cả việc xóa các con trỏ nội tại và trả về các phần bộ nhớ mà đối tượng đã dùng. Bộ môn Cơ điện tử Trang 4
  5. Lập trình ứng dụng trong kỹ thuật Chương 3 PHẦN B : CLASS TRONG C++/CLI Lớp trong C++/CLI cũng được đặc trưng bởi các thuộc tính và phương thức. Để bảo vệ tránh việc bị truy xuất tự do từ bên ngoài, các thuộc tính và phương thức trong lớp có sử dụng các từ khóa để qui định phạm vi truy xuất.  private : từ khóa cho biết chỉ cho phép truy xuất trong nội bộ lớp, không chia sẻ với các lớp khác.  protected : từ khóa cho biết được truy xuất hạn chế, chỉ cho phép truy xuất trong nội bộ lớp và các lớp con của lớp.  public : từ khóa cho biết được truy xuất tự do, cho phép truy xuất từ bên trong hoặc bên ngoài lớp. Đối với ref class, nếu ta không khai báo từ khóa qui định pham vi truy xuất, cách thức truy cập mặc định là private 1) Khai báo Class: // Class_name là tên của Class ref class Class_name { // Đoạn mã của Class Statement; // Lưu ý kết thúc Class phải có dấu ; }; VD : ref class Hinh_tron { public : // Variable : UInt16 R; // Method : UInt16 Chu_vi() { return 2*(Math::PI)*R; } UInt16 Dien_tich() { return (Math::PI)*R*R; } }; Trong ví dụ trên, chúng ta đã tạo ra 1 Class có tên là Hinh_tron quản lí các đối tượng là các hình tròn có bán kính khác nhau. Class có một thuộc tính là R (cho biết bán kính của đối tượng Bộ môn Cơ điện tử Trang 5
  6. Lập trình ứng dụng trong kỹ thuật Chương 3 hình tròn) và hai phương thức là Chu_vi() (tính chu vi của một đối tượng hình tròn) và Dien_tich() (tính diện tích của đối tượng). Thuộc tính của class : R. Biến có kiểu dữ liệu là UInt16. Phương thức của class : Chu_vi(), Dien_tich(). Các hàm không tham số có trả về giá trị. 2) Sử dụng Class: Trong chương trình chính (hàm main()), để tạo ra một đối tượng từ ref class đã khai báo, ta có hai cách : Cách 1 : Dùng Handle^ : Class_name^ name = gcnew Class_name(); // name là tên đối tượng. Cú pháp : // Tạo đối tượng hình tròn A. VD : Hinh_tron^ A = gcnew Hinh_tron(); Để truy xuất đến các biến và phương thức của ref class, ta dùng toán tử “->”. // Gán giá trị 5 cho thuộc tính R của đối tượng. VD : A->R = 5; Int16 x = A->Chu_vi(); // x = 31 ( 2*3.14*5 = 31.4 ) Int16 y = A->Dien_tich(); // y = 78 ( 5*5*3.14 = 78.5) Cách 2 : Dùng stack : // name là tên đối tượng. Cú pháp : Class_name name ; // Tạo đối tượng hình tròn A. VD : Hinh_tron A ; Để truy xuất đến các biến và phương thức của ref class, ta dùng toán tử “.”. // Gán giá trị 5 cho thuộc tính R của đối tượng. VD : A.R = 5; Int16 x = A.Chu_vi(); // x = 31 ( 2*3.14*5 = 31.4 ) Int16 y = A.Dien_tich(); // y = 78 ( 5*5*3.14 = 78.5) 3) Biến thành viên (Member Variable) : Các biến thành viên đơn giản là các biến được khai báo bên trong class. Cú pháp khai báo các biến thành viên cũng tương tự như khi khai báo các biến thông thường. Tuy nhiên, đối với các biến thành viên, không thể khởi tạo giá trị cho biến khi khai báo trong class và các biến này đi kèm với đối tượng khi đối tượng được khởi tạo. Giá trị của các biến thành viên có thể được gán thông qua constructor hay gán trực tiếp thông qua việc truy xuất đến đối tượng. VD : ref class Sinh_vien { Bộ môn Cơ điện tử Trang 6
  7. Lập trình ứng dụng trong kỹ thuật Chương 3 public: // các biến thành viên. String^ Ho_ten; UInt32 MSSV; String^ Nganh_hoc; … }; Trong chương trình chính, khi muốn truy xuất đến các biến thành viên của một class nào đó, bắt buộc phải thông qua đối tượng. Có nghĩa là ta phải tạo một đối tượng của class trước rồi sau đó mới có thể truy xuất các biến thành viên thông qua đối tượng này. Việc truy xuất đến các biến thành viên được thực hiện thông qua toán tử “->” đối với đối tượng kiểu handle hay toán tử “.” đối với đối tượng kiểu stack. VD : ref class Sinh_vien { public: // các biến thành viên. String^ Ho_ten; UInt32 MSSV; String^ Nganh_hoc; }; void main(void) { // Tạo đối tượng kiểu handle. Sinh_vien^ A; // Tạo đối tượng kiểu stack. Sinh_vien B; A->Ho_ten = “Nguyen Van A”; // Truy xuất đến biến thành viên B.Ho_ten = “Nguyen Van B”; A->MSSV = 8111123; B.MSSV = 8111124; Console::WriteLine(“{0}/t : {1}”,A->Ho_ten, A->MSSV); Console::WriteLine(“{0} /t: {1}”,B.Ho_ten, B.MSSV); Console::ReadKey(); } Kết quả in ra màn hình : Nguyen Van A : 8111123 Nguyen Van B : 8111124 Lưu ý : Nếu không gán giá trị cho các biến thành viên tương ứng với đối tượng thì các biến này sẽ có giá trị mặc định là giá trị mặc định của kiểu dữ liệu. Biến tĩnh (static variable) : Bộ môn Cơ điện tử Trang 7
  8. Lập trình ứng dụng trong kỹ thuật Chương 3 Nếu như muốn giá trị ban đầu cho biến trong khi khai báo biến thành viên trong class, ta phải sử dụng biến tĩnh (khi khai báo biến tĩnh thì thêm từ khóa static). Giá trị khởi tạo này sẽ là mặc định và chỉ được gán một lần duy nhất khi tạo đối tượng. Do đó khi ta gán giá trị mới cho các biến tĩnh này thì biến sẽ cập nhật giá trị này. VD : ref class Sinh_vien { public: // các biến thành viên. String^ Ho_ten; UInt32 MSSV; static String^ Nganh_hoc = “Co dien tu” ; // Biến tĩnh. }; void main(void) { Sinh_vien^ A; A->Ho_ten = “Nguyen Van A”; Console::WriteLine(“Ho va ten : {0}” , A->Ho_ten); Console::WriteLine(“Nganh hoc : {0}”, A->Nganh_hoc); Console::ReadKey(); } Kết quả in ra màn hình : Ho va ten : Nguyen Van A Nganh hoc : Co dien tu Các biến tĩnh còn cho phép truy xuất trực tiếp mà không cần phải thông qua đối tượng. Việc truy xuất đến biến tĩnh có thể thông qua tên class và toán tử “::”; giá trị của biến là giá trị mặc định đã gán cho biến trong class. VD: void main(void) { String^ a = Sinh_vien::Nganh_hoc; Console::WriteLine(“Nganh hoc : {0}”, a); Console::ReadKey(); } Kết quả in ra màn hình : Nganh hoc : Co dien tu Bộ môn Cơ điện tử Trang 8
  9. Lập trình ứng dụng trong kỹ thuật Chương 3 Các biến tĩnh hay biến thành viên đều có thể được gán giá trị khác thông qua đối tượng. Trong trường hợp muốn khai báo một biến hằng số có giá trị cho trước và không cho phép thay đổi giá trị này, ta có thể khai báo biến dưới dạng biến hằng số (thêm từ khóa const khi khai báo). VD : ref class Sinh_vien { public: // các biến thành viên. String^ Ho_ten; UInt32 MSSV; const static String^ Nganh_hoc = “Co dien tu” ; // Biến hằng số. }; Các biến PI và E trong class Math là các biến hằng số . Lưu ý : Để khai báo biến hằng số tĩnh, ta có thể dùng từ khóa const static hay literal. Hai cách khai báo này là tương đương nhau. 4) Phƣơng thức thành viên (Member Method) : Cũng giống như biến thành viên, phương thức thành viên đơn giản là các hàm được khai báo bên trong class. Cú pháp khai báo các phương thức thành viên cũng tương tự như khi khai báo các hàm thông thường. VD : ref class Hinh_tron { public : // Variable : UInt16 R; // Method : UInt16 Chu_vi() { return 2*(Math::PI)*R; } UInt16 Dien_tich() { return (Math::PI)*R*R; } }; Trong ví dụ trên, có hai phương thức thành viên là Chu_vi() và Dien_tich(). Lưu ý là các biến thành viên là các biến toàn cục, do đó ta có thể sử dụng các biến này trong khi khai báo các Bộ môn Cơ điện tử Trang 9
  10. Lập trình ứng dụng trong kỹ thuật Chương 3 phương thức thành viên (hai phương thức thành viên trong ví dụ trên có sử dụng biến thành viên R). Các phương thức thành viên chỉ có thể được truy xuất thông qua đối tượng bằng toán tử “->”. Lưu ý : Class cũng cho phép khai báo các phương thức quá tải (overload method) giống như việc khai báo các hàm quá tải (overload function). Phƣơng thức tĩnh (static method) : Phương thức tĩnh cũng tương tự như biến tĩnh : khi khai báo phương thức tĩnh thì thêm từ khóa static, phương thức tĩnh cũng có thể truy xuất trực tiếp qua tên class và toán tử “::” . Tất cả các biến hay tham số sử dụng trong phương thức tĩnh bắt buộc phải là các biến tĩnh. VD : ref class Sinh_vien { public: // các biến thành viên tĩnh. static String^ Ho_ten = “Nguyen Van A”; static UInt32 MSSV = 8111111; static String^ Nganh_hoc = “Co dien tu” ; // Phương thức tĩnh static void Show(Sinh_vien^ A) { Console ::WriteLine(“Ho va ten : ”+A->Ho_ten); Console ::WriteLine(“MSSV : ”+A->MSSV); Console ::WriteLine(“Nganh hoc : ”+A->Nganh_hoc); } }; void main(void) { Sinh_vien^ A; A->Ho_ten = “Nguyen Van B”; Sinh_vien::Show(A); Console::ReadKey(); } Kết quả in ra màn hình : Ho va ten : Nguyen Van B MSSV : 8111111 Nganh hoc : Co dien tu Bộ môn Cơ điện tử Trang 10
  11. Lập trình ứng dụng trong kỹ thuật Chương 3 Các phương thức WriteLine(), Write(), ReadLine() … trong class Console hay Concat() trong class String là các phương thức tĩnh. Constructor : Constructor là một phương thức đặc biệt của class cho phép chúng ta khởi tạo giá trị cho các biến của class khi khai báo. Constructor được khai báo bên trong Class Class_name ( argument1 , argument 2, …) Cú pháp : { Statement; } Trong đó, argument là các tham số của constructor, các tham số này dùng để truyền giá trị cho các biến của class khi khởi tạo. VD : khai báo Constructor cho class Hinh_tron. ref class Hinh_tron { public : // Constructor : Hinh_tron (UInt16 r) { // truyền giá trị cho biến R của class. R = r; } // Variable : UInt16 R; … }; Khi tạo đối tượng, ta có thể khởi tạo các thuộc tính ban đầu của đối tượng thông qua constructor thay vì phải gán trực tiếp. Vì có 2 cách tạo đối tượng nên tương ứng cũng có hai cách gọi constructor. VD : tạo và khởi tạo giá trị cho đối tượng A. Kiểu Handle : Hinh_tron^ A = gcnew Hinh_tron(5) ; Kiểu Stack : Hinh_tron A (5); Trong ví dụ trên, đối tượng A sau khi được tạo thì giá trị biến R của A được gán giá trị 5. Lưu ý : Nếu trong class đã có khai báo constructor, khi tạo đối tượng ta phải theo đúng cấu trúc của constructor. VD : Nếu trong class Hinh_tron đã có khai báo constructor, dòng lệnh sau khi tạo đối tượng sẽ báo lỗi : Bộ môn Cơ điện tử Trang 11
  12. Lập trình ứng dụng trong kỹ thuật Chương 3 Kiểu Handle : Hinh_tron^ A = gcnew Hinh_tron() ; // Error Kiểu Stack : Hinh_tron A ; // Error Lí do là ta chưa truyền giá trị cho tham số của constructor khi khai báo. Kiểu Handle : Hinh_tron^ A = gcnew Hinh_tron(0) ; // OK Kiểu Stack : Hinh_tron A (0); // OK Copy constructor : Copy constructor là phương thức cho phép gán lẫn nhau giữa các đối tượng khác nhau của cùng một class được tạo ra. Cú pháp : Class_name ( const Class_name %p) { Val1 = p.Val1; Val2 = p.Val2; …. Valn = p.Valn } Trong đó const là từ khóa khai báo; Val1, Val2, …Valn là các biến của class. VD : xét lại ví dụ class Hinh_tron. ref class Hinh_tron { public : // Variable : UInt16 R; // Constructor : Hinh_tron (UInt16 r) { // truyền giá trị cho biến R của class. R = r; } // Copy constructor : Hinh_tron (const Hinh_tron %p) { R = p.R; } … }; Trong chương trình chính, nếu như có hai đối tượng Hinh_tron được tạo ra, ta có thể gán lẫn nhau giữa hai đối tượng này. VD : void main(void) { Bộ môn Cơ điện tử Trang 12
  13. Lập trình ứng dụng trong kỹ thuật Chương 3 Hinh_tron A(10); // Gán giá trị cho đối tượng B Hinh_tron B = A; Console::WriteLine(“Chu vi hinh tron B = {0}”,B.Chu_vi()); Console::ReadKey(); } Kết quả in ra màn hình : Chu vi hinh tron B = 62 Destructor : Destructor là một phương thức đặc biệt của class cho phép chúng ta xóa các đối tượng hay phương thức đã được tạo trước đó. Mục đích của destructor là giúp giải phóng bộ nhớ đã được cấp phát khi khởi tạo đối tượng đồng thời giải phóng các tài nguyên hệ thống đã được cung cấp cho đối tượng. Destructor được khai báo bên trong Class. Cú pháp : ~Class_name () { Statement; } Lưu ý, chỉ nên khai báo destructor khi trong class có các biến kiểu con trỏ (array, string). Để giải phóng bộ nhớ, ta dùng lệnh delete với các biến này. VD : ref class Sinh_vien { public : // Variable : String^ Ho_ten; String^ Que_quan; String^ Nganh_hoc; // Destructor : ~Sinh_vien () { delete Ho_ten; delete Que_quan; delete Nganh_hoc; } … }; 5) Toán tử (Operator) : Ta cũng có thể định nghĩa các toán tử (operator) trong class để thực hiện các tính toán trên các đối tượng của class. C++/CLI cho phép định nghĩa các toán tử một ngôi (unary) và hai ngôi (Binary) trong class Toán tử một ngôi (Unary Operator) : Bộ môn Cơ điện tử Trang 13
  14. Lập trình ứng dụng trong kỹ thuật Chương 3 Cú pháp : static Class_name^ operator *(const Class_name ^ A) { Statement; } Trong đó “*” là kí hiệu của toán tử được định nghĩa và A là tên của toán hạng. C++/CLI hỗ trợ các kí hiệu toán tử sau : + - * / % ^ & | ~ ! = < > += *= /= %= ^= |= > = == != = && || ++ -- , VD : Đoạn mã sau sẽ xây dựng Class Complex quản lí các đối tượng là các số phức (có dạng a + bj). Mỗi đối tượng được đặc trưng bởi 2 biến : Re (phần thực) và Im (phần ảo). Trong Class có định nghĩa toán tử “-” một tham số trên số phức A (a + bj) có chức năng trả về số phức liên hợp của A (a – bj). ref class Complex { public : // Variable : float Re; float Im; // Constructor : Complex (float a, float b) { Re = a; Im = b; } //Method : void Show() { Console::WriteLine(Re+ “ + ” + Im); } //Operator : static Complex^ operator - (const Complex^ A) Bộ môn Cơ điện tử Trang 14
  15. Lập trình ứng dụng trong kỹ thuật Chương 3 { Complex^ B = gcnew Complex(0,0); //Khởi tạo đối tượng B. B->Re = A->Re; B->Im = -(B->Im); return B; } }; void main (void) { Complex^ A = gcnew Complex(5,10); //Khởi tạo số phức A = 5 + 10j. // Khởi tạo số phức B là số phức liên hợp của A nhờ toán tử - Complex^ B = -A; A->Show(); B->Show(); } Kết quả in ra màn hình : 5 + 10j. 5 + -10j. Toán tử hai ngôi (Binary Operator) : Cú pháp : static Class_name^ operator *(const Class_name ^ A, const Class_name ^ B) { Statement; } Trong đó “*” là kí hiệu của toán tử được định nghĩa; A, B là các toán hạng của phép toán. + - * / % ^ & | ~ ! = < > += *= /= %= ^= |= > = == != = && || ++ -- , VD : Đoạn mã sau sẽ định nghĩa toán tử “+” cho Class Complex có chức năng cộng hai số phức. ref class Complex { public : // Variable : float Re; Bộ môn Cơ điện tử Trang 15
  16. Lập trình ứng dụng trong kỹ thuật Chương 3 float Im; // Constructor : Complex (float a, float b) { Re = a; Im = b; } //Method : void Show() { Console::WriteLine(Re+ “ + ” + Im); } //Operator : static Complex^ operator + (const Complex^ A, const Complex^ B) { Complex^ C = gcnew Complex(0,0); //Khởi tạo đối tượng C. C->Re = A->Re + B->Re; C->Im = A->Im + B->Im; return C; } }; void main (void) { Complex^ A = gcnew Complex(5,10); //Khởi tạo số phức A = 5 + 10j. Complex^ B = gcnew Complex(7,-10); Complex^ C = A + B; A->Show(); B->Show(); C->Show(); } Kết quả in ra màn hình : 5 + 10j 7 + -10j 12 + 0j 6) Class thừa kế (Nested Class) : Bộ môn Cơ điện tử Trang 16
  17. Lập trình ứng dụng trong kỹ thuật Chương 3 Class thừa kế hay class con là class được khai báo bên trong một class khác. Class chứa class con được gọi là class cơ sở hay class dẫn xuất. Cú pháp khai báo class con cũng tương tự như class thông thường. Cú pháp // Khai báo class dẫn xuất ref class Class_name1 { public: ref class Class_name2 // Khai báo class con. { // Đoạn mã của class con. Statement; }; // Đoạn mã của class cha. Statement; }; VD : ref class Hinh_tron { public : // Variable : UInt16 R; // Method : UInt16 Chu_vi() { return 2*(Math::PI)*R; } UInt16 Dien_tich() { return (Math::PI)*R*R; } ref class Hinh_vuong { public : // Variable : UInt16 a; // Method : UInt16 Chu_vi() Bộ môn Cơ điện tử Trang 17
  18. Lập trình ứng dụng trong kỹ thuật Chương 3 { return 4*a; } UInt16 Dien_tich() { return a*a; } }; }; Sử dụng Nested Class: Trong chương trình chính (hàm main()), để tạo ra một đối tượng từ ref class con đã khai báo, ta phải truy xuất thông qua class cha. Cách 1 : Dùng Handle^ : Cú pháp : Class_name1::Class_name2^ name = gcnew Class_name1::Class_name2(); Lưu ý : Nếu trong class đã có khai báo constructor, khi tạo đối tượng ta phải theo đúng cấu trúc của constructor. VD : Hinh_tron::Hinh_vuong^ A = gcnew Hinh_tron::Hinh_vuong(10); Để truy xuất đến các biến và phương thức của ref class, ta dùng toán tử “->”. // Gán giá trị 5 cho thuộc tính a của đối tượng. VD : A->a = 5; UInt16 x = A->Chu_vi(); // x = 20 UInt16 y = A->Dien_tich(); // y = 25 Cách 2 : Dùng stack : // name là tên đối tượng. Cú pháp : Class_name1::Class_name2 name ; // Tạo đối tượng hình tròn A. VD : Hinh_tron::Hinh_vuong A(5) ; Để truy xuất đến các biến và phương thức của ref class, ta dùng toán tử “.”. // Gán giá trị 5 cho thuộc tính R của đối tượng. VD : A.R = 5; UInt16 x = A.Chu_vi(); // x = 20 Bộ môn Cơ điện tử Trang 18
  19. Lập trình ứng dụng trong kỹ thuật Chương 3 UInt16 y = A.Dien_tich(); // y = 25 Quay trở lại ví dụ về class Hinh_vuong là class con của Class Hinh_tron đã khai báo, trong hàm main() VD : void main() { Hinh_tron^ A = gcnew Hinh_tron(10); Console::WriteLine("Chu vi hinh tron A: " + A->Chu_vi()); Hinh_tron::Hinh_vuong^ B = gcnew Hinh_tron::Hinh_vuong(25); Hinh_tron::Hinh_vuong C(25); Console::WriteLine("Chu vi hinh vuong B: " + B->Chu_vi()); Console::WriteLine("Chu vi hinh vuong C: " + C.Chu_vi()); Console::ReadKey(); } Kết quả in ra màn hình : Chu vi hinh tron A : 62 Chu vi hinh vuong B : 100 Chu vi hinh vuong C : 100 Bộ môn Cơ điện tử Trang 19
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

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