Tải bản đầy đủ (.pdf) (19 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (311.02 KB, 19 trang )

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 lng 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 tố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 tốn đó.
 Giải thuật ln ln 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 ln 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


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 ngồ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 tố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


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


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 ln ln đượ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 tồ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


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:
ref class Class_name

// Class_name là tên của Class

{
Statement;
};

// Đoạn mã của Class
// 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


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^ :
Cú pháp :
Class_name^ name = gcnew Class_name(); // name là tên đối tượng.
VD :


Hinh_tron^ A = gcnew Hinh_tron();

// Tạo đối tượng hình trịn A.

Để truy xuất đến các biến và phương thức của ref class, ta dùng toán tử “->”.
A->R = 5;

// Gán giá trị 5 cho thuộc tính R của đối tượng.

Int16 x = A->Chu_vi();
Int16 y = A->Dien_tich();

VD :

// x = 31 ( 2*3.14*5 = 31.4 )
// y = 78 ( 5*5*3.14 = 78.5)

Cách 2 : Dùng stack :
Cú pháp :
Class_name name ;
VD :

Hinh_tron A ;

// name là tên đối tượng.

// Tạo đối tượng hình trịn A.

Để truy xuất đến các biến và phương thức của ref class, ta dùng toán tử “.”.

A.R = 5;

// Gán giá trị 5 cho thuộc tính R của đối tượng.

Int16 x = A.Chu_vi();
Int16 y = A.Dien_tich();

VD :

// x = 31 ( 2*3.14*5 = 31.4 )
// 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


Lập trình ứng dụng trong kỹ thuật

Chương 3


public:
String^ Ho_ten;
UInt32 MSSV;
String^ Nganh_hoc;


// các biến thành viên.

};

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 tố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:
String^ Ho_ten;
UInt32 MSSV;
String^ Nganh_hoc;

// các biến thành viên.

};
void main(void)
{
Sinh_vien^
A;

// Tạo đối tượng kiểu handle.
Sinh_vien
B;
// Tạo đối tượng kiểu stack.
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
Nguyen Van B

: 8111123
: 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



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:
String^ Ho_ten;
// các biến thành viên.
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à tố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
Bộ mơn Cơ điện tử

:

Nganh hoc : Co dien tu
Trang 8


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:
String^ Ho_ten;
// các biến thành viên.
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


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

Bộ mơn Cơ điện tử

:

Ho va ten : Nguyen Van B
MSSV : 8111111

Nganh hoc : Co dien tu
Trang 10


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
Cú pháp :

Class_name ( argument1 , argument 2, …)
{
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)
{
R = r;

// truyền giá trị cho biến R của class.
}
// 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


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)
{
R = r;
// truyền giá trị cho biến R của class.
}
// 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



Lập trình ứng dụng trong kỹ thuật

Chương 3

Hinh_tron A(10);
Hinh_tron B = A;
// Gán giá trị cho đối tượng B
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 tốn tử (operator) trong class để thực hiện các tính tố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
Tốn tử một ngôi (Unary Operator) :
Bộ môn Cơ điện tử

Trang 13



Lập trình ứng dụng trong kỹ thuật

Cú pháp :

Chương 3

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 tốn hạng. C++/CLI hỗ
trợ các kí hiệu tố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 tố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



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.
Complex^ B = -A;
// Khởi tạo số phức B là số phức liên hợp của A nhờ toán tử A->Show();
B->Show();
}

Kết quả in ra màn hình

:

5 + 10j.
5 + -10j.

Tố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 tố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 tố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


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


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
ref class
{
public:
ref
{


Class_name1

class

// Khai báo class dẫn xuất

Class_name2

Statement;

// Khai báo class con.
// Đoạn mã của class con.

};
Statement;

// Đoạn mã của class cha.

};
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


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ử “->”.
A->a = 5;

// Gán giá trị 5 cho thuộc tính a của đối tượng.

UInt16 x = A->Chu_vi();
UInt16 y = A->Dien_tich();

VD :

// x = 20
// y = 25

Cách 2 : Dùng stack :
Cú pháp :
Class_name1::Class_name2 name ;
VD :


Hinh_tron::Hinh_vuong A(5) ;

// name là tên đối tượng.

// Tạo đối tượng hình trịn A.

Để truy xuất đến các biến và phương thức của ref class, ta dùng toán tử “.”.
A.R = 5;

// Gán giá trị 5 cho thuộc tính R của đối tượng.

UInt16 x = A.Chu_vi();

VD :

// x = 20

Bộ môn Cơ điện tử

Trang 18


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

Bộ mơn Cơ điện tử

:

Chu vi hinh tron A : 62
Chu vi hinh vuong B : 100
Chu vi hinh vuong C : 100

Trang 19



×