SlideShare a Scribd company logo
1 of 70
Download to read offline
class

Bộ môn Công nghệ phần mềm
Khoa Công nghệ thông tin
Trường Đại học Khoa học Tự nhiên
VCBB© 19.03a

operator

true
public

C++

PP LT HƯỚNG ĐỐI TƯỢNG
cout

catch

ThS. Đặng Bình Phương

this

dbphuong@fit.hcmus.edu.vn

THUỘC TÍNH ĐỐI TƯỢNG
& PHƯƠNG THỨC

inline
new

cin
friend

STL

bool
using

OOP

try
virtual

false

private

throw
delete

1
1 2 3 4 5 6 7

VC


BB

Nội dung

Phương thức tạo lập (constructor)
Phương thức hủy (destructor)
Tham số của phương thức
Định nghĩa phép toán (operator) cho kiểu dữ liệu mới
Phương thức chuyển đổi kiểu dữ liệu (casting method)
Một số vấn đề liên quan khác
Mẫu thiết kế Singleton và áp dụng
#include <iostream>
using namespace std;
void main()
{
cout << “Hello World”;
cout << endl;

Thuộc tính đối tượng và phương thức

2
1 2 3 4 5 6 7 Phương thức tạo lập (constructor)

VC


BB

Nhu cầu

Thuộc tính đối tượng và phương thức

3
1 2 3 4 5 6 7 Phương thức tạo lập (constructor)

VC


BB

Đặc điểm (trong NNLT C++)

Tên trùng với tên lớp và không có kiểu trả về.
Tự động thực thi khi đối tượng được tạo nhằm
khởi tạo dữ liệu và chuẩn bị những công việc
cần thiết để bắt đầu chu kỳ sống của đối tượng.
Có thể có nhiều phương thức tạo lập nạp chồng
nhau (overloading) được phân biệt theo quy tắc
như việc chồng các hàm (phân biệt nhờ danh
sách tham số truyền vào).
Tạo lập

Sử dụng

Hủy
Thuộc tính đối tượng và phương thức

4
1 2 3 4 5 6 7 Phương thức tạo lập (constructor)

VC


BB

Phân loại

Phương thức tạo lập mặc định (default constructor)
 Không có tham số đầu vào.
 Được tự động tạo ra nếu lớp không có bất kỳ
phương thức tạo lập nào được định nghĩa.
Phương thức tạo lập sao chép (copy constructor)
 Để tạo ra một đối tượng từ một đối tượng có sẵn.
Phương thức tạo lập người lập trình định nghĩa
 Có thể quy định các tham số đầu vào khác
nhau để khởi tạo dữ liệu cho đối tượng.
Thuộc tính đối tượng và phương thức

5
1 2 3 4 5 6 7 Phương thức tạo lập (constructor)

VC



Cú pháp khai báo và định nghĩa

BB

Khai báo phương thức tạo lập (tổng quát)
1

class-name(param-list);

Định nghĩa phương thức tạo lập
1
2
3
4
5

class-name::class-name(param-list)

{
// Khởi tạo dữ liệu và chuẩn bị những công việc
// cần thiết để bắt đầu chu kỳ sống của đối tượng…
}

Thuộc tính đối tượng và phương thức

6
1 2 3 4 5 6 7 Phương thức tạo lập (constructor)

VC



Ví dụ

BB

Khai báo lớp CFraction (tập tin Fraction.h)
1
2
3
4
5
6
7
8
9
10
11
12
13
14

#ifndef _FRACTION_H
#define _FRACTION_H
class CFraction
{
int m_nNum;

// Tử số (numerator)

int m_nDenom;

// Mẫu số (denominator)

public:
CFraction();

// Phương thức tạo lập mặc định

CFraction(int);

// Phương thức tạo lập dạng tử/1

CFraction(int, int); // Phương thức tạo lập dạng tử/mẫu
};
#endif
Thuộc tính đối tượng và phương thức

7
1 2 3 4 5 6 7 Phương thức tạo lập (constructor)

VC



Ví dụ

BB

Cài đặt lớp CFraction (tập tin Fraction.cpp)
1
2
3
4
5
6
7
8
9
10
11
12
13
14

#include “Fraction.h”
// Phương thức tạo lập mặc định (default constructor)

CFraction::CFraction() { m_nNum = 0; m_nDenom = 1; }
// Phương thức tạo lập dạng tử/1
CFraction::CFraction(int nNum) { m_nNum = nNum; m_nDenom = 1; }

// Phương thức tạo lập dạng tử/mẫu
CFraction::CFraction(int nNum, int nDenom)
{
if (nDenom < 0) { nNum = -nNum; nDenom = -nDenom; }
if (nDenom == 0) { nDenom = 1; }

m_nNum = nNum; m_nDenom = nDenom;
}
Thuộc tính đối tượng và phương thức

8
1 2 3 4 5 6 7 Phương thức tạo lập (constructor)

VC


BB

Ví dụ

Một số khai báo hợp lệ
1
2
3
4
5
6
7
8
9
10
11
12
13
14

CFraction frac1;

//  ()

CFraction frac2(1506);

//  (int)

CFraction frac3(12, 8);

//  (int, int)

CFraction* pFrac1 = new CFraction;

//  new CFraction()

CFraction* pFrac2 = new CFraction(1506); //  (int)
CFraction* pFrac3 = new CFraction(12, 8);//  (int, int)
CFraction aFrac1[2];

//  () x 2

CFraction aFrac2[2] = {2912, 1706};

//  (int) x 2

CFraction aFrac3[2] = {CFraction(2912), CFraction(1706)};
CFraction aFrac4[2] = {CFraction(369), CFraction(156, 128)};
CFraction* paFrac = new CFraction[2];

//  () x 2
Thuộc tính đối tượng và phương thức

9
1 2 3 4 5 6 7 Phương thức tạo lập (constructor)

VC


BB

Phương thức tạo lập sao chép

Khái niệm
 Khởi tạo đối tượng của một lớp dựa trên việc
sao chép một đối tượng sẵn có của lớp đó
(không áp dụng cho phép gán).
 Được thực thi khi truyền hoặc trả về đối
tượng của lớp đó theo kiểu tham trị.
Ví dụ
1
2
3
4
5

CFraction doSomething(CFraction frac) { /* Xử lý… */ }
CFraction frac1(82, 85), frac2;
CFraction frac3(frac1);

// Khởi tạo frac3 từ frac1

CFraction frac4 = frac1;

// Khởi tạo frac4 từ frac1

frac2 = doSomething(frac1);

// Khởi tạo khi truyền và trả
Thuộc tính đối tượng và phương thức

10
1 2 3 4 5 6 7 Phương thức tạo lập (constructor)

VC


BB

Phương thức tạo lập sao chép mặc định

Trong C++, phương thức tạo lập sao chép mặc
định (default copy constructor) được tự động
sinh ra cho lớp đối tượng do người lập trình tự
định nghĩa và giúp sao chép từng thành phần
thuộc tính (member-wise copy) từ đối tượng
nguồn sang đối tượng đích theo dạng từng bit
(bit-wise copy).
Nếu các thành phần dữ liệu là các kiểu con trỏ
thì quá trình sao chép sẽ chỉ sao chép địa chỉ của
con trỏ (shallow copy) chứ không thật sự sao
chép vùng nhớ mà chúng quản lý (deep copy).
Thuộc tính đối tượng và phương thức

11
1 2 3 4 5 6 7 Phương thức tạo lập (constructor)

VC


BB

Hình ảnh minh họa
: CFraction

: CFraction

- m_nNum: int

- m_nNum: int

- m_nDenom: int

- m_nDenom: int

: CDynamicArray

: CDynamicArray

- m_nSize: int

- m_nSize: int

- m_pData: int*

- m_pData: int*

Vùng nhớ
Vùng nhớ
chứa dữ liệu
đã bị hủy
Thuộc tính đối tượng và phương thức

12
1 2 3 4 5 6 7 Phương thức tạo lập (constructor)

VC


BB

Cài đặt phương thức tạo lập sao chép

Khai báo phương thức tạo lập sao chép
1

class-name(const class-name&);

Lưu ý
 Nếu tham số được khai báo ở dạng tham trị
thì phương thức tạo lập sao chép lại được
kích hoạt để sao chép đối tượng này  lỗi do
sử dụng phương thức đang được định nghĩa!
 Việc sử dụng tham chiếu (&) kết hợp với
const (pass-by-reference-to-const) để đối
tượng không bị sao chép và bị thay đổi.
Thuộc tính đối tượng và phương thức

13
1 2 3 4 5 6 7 Phương thức tạo lập (constructor)

VC



Cài đặt phương thức tạo lập sao chép

BB

Ví dụ cài đặt cho lớp mảng động
1
2
3
4
5
6
7
8
9
10
11
12
13

class CDynamicArray
{
int m_nSize;
int* m_panData;
public:

CDynamicArray(const CDynamicArray&);
};
CDynamicArray::CDynamicArray(const CDynamicArray& dynArr) {
m_nSize = dynArr.m_nSize;
m_panData = new int[m_nSize];

for (int i = 0; i < m_nSize; i++)
m_panData[i] = dynArr.m_pansData[i];
}
Thuộc tính đối tượng và phương thức

14
1 2 3 4 5 6 7 Phương thức tạo lập (constructor)

VC


BB

Đối sánh giữa C++, Java và C#

Đọc thêm [OOP] trang 83-87.
 Chuỗi phương thức tạo lập (constructor
chaining).
 Phương thức tạo lập trong kế thừa.
 Xử lý khi có lỗi trong phương thức tạo lập.
 Phương thức tạo lập sao chép mặc định.
 Phương thức tạo lập tĩnh.

Thuộc tính đối tượng và phương thức

15
1 2 3 4 5 6 7 Phương thức hủy (destructor)

VC


BB

Nhu cầu

Thuộc tính đối tượng và phương thức

16
1 2 3 4 5 6 7 Phương thức hủy (destructor)

VC


BB

Đặc điểm (trong NNLT C++)

Tên trùng với tên lớp và có dấu ~ ở phía trước.
Không có tham số đầu vào và giá trị trả về.
Mỗi lớp chỉ có duy nhất một phương thức hủy.
Tự động thực hiện mỗi khi đối tượng của lớp
bị hủy (hết phạm vi sử dụng).
Chỉ được thực hiện một lần duy nhất trong
chu kỳ sống của đối tượng.
Trình biên dịch sẽ tự động tạo phương thức hủy
mặc định (default destructor, không làm gì cả)
nếu lớp không có phương thức hủy nào.
Thuộc tính đối tượng và phương thức

17
1 2 3 4 5 6 7 Phương thức hủy (destructor)

VC



Cú pháp khai báo và định nghĩa

BB

Khai báo phương thức hủy
1

~class-name();

Định nghĩa phương thức hủy
1
2
3
4

class-name::~class-name()

{
// Giải phóng tài nguyên đã cấp phát cho đối tượng…
}

Thuộc tính đối tượng và phương thức

18
1 2 3 4 5 6 7 Phương thức hủy (destructor)

VC



Ví dụ

BB

Cài đặt phương thức hủy cho lớp mảng động
1
2
3
4
5
6
7
8
9
10
11
12
13
14

class CDynamicArray
{
int m_nSize;
int* m_panData;
public:

~CDynamicArray();
};
CDynamicArray::~CDynamicArray() {
if (m_nSize > 0)
{

m_nSize = 0;
delete []m_panData;
}
}
Thuộc tính đối tượng và phương thức

19
1 2 3 4 5 6 7 Phương thức hủy (destructor)

VC



Ví dụ

BB

Cài đặt lớp CTimer
1
2
3
4
5
6
7
8
9
10
11
12
13
14

#include <ctime>
class CTimer
{
clock_t m_clockStart;

public:
CTimer() { m_clockStart = clock(); }
~CTimer()
{
clock_t clockEnd = clock();

cout << “Elapsed time: ” <<
(clockEnd – m_clockStart) << endl;
}
};
Thuộc tính đối tượng và phương thức

20
1 2 3 4 5 6 7 Phương thức hủy (destructor)

VC


BB

Đối sánh giữa C++, Java và C#

Đọc thêm [OOP] trang 90.
 Cơ chế “dọn rác” (garbage collector).
 Nguy cơ khi quên hủy tài nguyên đã cấp phát.

Thuộc tính đối tượng và phương thức

21
1 2 3 4 5 6 7 Tham số của phương thức

VC


BB

Tham số giá trị (tham trị)
int x

int y

18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25

…

03 00 00 00 06 00 00 00

swap

int x

int y

…

int t = x;
x = y;
y = t;

0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17

…

03 00 00 00 06 00 00 00
int a = 3

int b = 6

…
Thuộc tính đối tượng và phương thức

22
1 2 3 4 5 6 7 Tham số của phương thức

VC


BB

Tham số con trỏ
int* px

int* py

18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25

…

0B 00 00 00 0F 00 00 00

swap

…

int t = *px;
int* px int* py *px = *py;
*py = t;

0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17

…

03 00 00 00 06 00 00 00
int a = 3

int b = 6

…
Thuộc tính đối tượng và phương thức

23
1 2 3 4 5 6 7 Tham số của phương thức

VC


BB

Tham số tham biến (tham chiếu)

swap

int &x

int &y

int t = x;
x = y;
y = t;

0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17

…

05 00 00 00 06 00 00 00
int a = 3

int b = 6

…
Thuộc tính đối tượng và phương thức

24
1 2 3 4 5 6 7 Tham số của phương thức

VC



Giá trị mặc định cho các tham số

BB

Xem lại Chương 1 – Phần 3. Vấn đề về giá trị
mặc định của tham số hàm.
Ví dụ
1
2
3
4
5
6
7
8
9
10
11

class CFraction
{

int m_nNum, m_nDenom;
public:
//  CFraction(), CFraction(int), CFraction(int, int)
CPhanSo(int nNum = 0, int nDenom = 1)
{

if (nDenom == 0) { nDenom = 1; }
m_nNum = nNum; m_nDenom = nDenom;
}
};
Thuộc tính đối tượng và phương thức

25
1 2 3 4 5 6 7 Tham số của phương thức

VC



Số lượng tham số không biết trước

BB

Xem lại Chương 1 – Phần 6. Vấn đề về hàm có
số lượng tham số không biết trước.
Ví dụ
1
2
3
4
5
6
7
8
9
10
11

class CDynamicArray
{

int m_nSize;
int* m_panData;
public:
CDynamicArray(int nValue, ...)
{

// Các thao tác khởi tạo mảng từ dãy các số nguyên
// được truyền vào hàm tạo…
}
};
Thuộc tính đối tượng và phương thức

26
1 2 3 4 5 6 7 Tham số của phương thức

VC


BB

Đối sánh giữa C++, Java và C#

Đọc thêm [OOP] trang 107-110.
 Tham trị và tham chiếu.

Thuộc tính đối tượng và phương thức

27
1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới

VC


BB

Nhu cầu và cách thực hiện

Xem lại Chương 1 – Phần 7. Nhu cầu về ký hiệu
phép toán cho kiểu dữ liệu mới nhưng là các
phương thức toán tử thực hiện trên các đối
tượng của lớp (class) thay vì là các hàm toán tử
thực hiện trên biến có kiểu cấu trúc (struct).
Nếu viết toán tử bên trong lớp và toán hạng thứ
nhất là đối tượng thuộc lớp đó thì không liệt kê
trong danh sách tham số của toán tử. Ngược lại
phải liệt kê và sử dụng từ khóa friend để có
thể truy cập các thành phần riêng của đối tượng.
Thuộc tính đối tượng và phương thức

28
1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới

VC



Hàm bạn (friend function) trong C++

BB

Khái niệm
 Hàm không phải thành viên của lớp nhưng có
thể truy cập các thành viên riêng của lớp đó.
 Được định nghĩa như một hàm bình thường
nhưng bên trong khai báo lớp mà hàm làm
bạn sẽ có nguyên mẫu hàm (prototype) bắt
đầu bằng từ khóa friend.
1
2
3
4
5

return-type func-name(param-list) { /* … */ }
class CFriendTest
{
friend func-name(param-list);
};
Thuộc tính đối tượng và phương thức

29
1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới

VC



Hàm bạn (friend)

BB

Khái niệm
 Hàm không phải thành viên của lớp nhưng có
thể truy cập các thành viên riêng của lớp đó.
 Được định nghĩa như một hàm bình thường
nhưng bên trong khai báo lớp mà hàm làm
bạn sẽ có nguyên mẫu hàm (prototype) bắt
đầu bằng từ khóa friend.
1
2
3
4
5

class CFriendTest
{
friend func-name(param-list);
};
return-type func-name(param-list) { /* … */ }
Thuộc tính đối tượng và phương thức

30
1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới

VC


BB

Hàm bạn (friend)

Lưu ý
 Hữu ích khi quá tải toán tử hoặc truy cập các
thành viên riêng của hai hay nhiều lớp khác
nhau (hàm là friend của hơn một lớp).
 Hàm friend không phải là thành viên của lớp
mà nó làm bạn mà chỉ là hàm thường, do đó:
Khi định nghĩa hàm không sử dụng toán tử ::
• Không thể gọi hàm bằng cách dùng tên đối tượng
và toán tử truy cập thành viên (toán tử . hoặc ->).
• Không có con trỏ this trong hàm.
• Không thể được kế thừa.
•

Thuộc tính đối tượng và phương thức

31
1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới

VC



Ví dụ

BB

Toán tử + được viết bên trong lớp
1
2
3
4
5
6
7
8
9
10
11
12
13
14

class CFraction
{
int m_nNum, m_nDenom;
public:
const CFraction operator+(const CFraction&);

};
const CFraction CFraction::operator+(const CFraction& fracR)
{
CFraction fracResult;
fracResult.m_nNum = this->m_nNum * fracR.m_nDenom

+ fracR.m_nNum * this->m_nDenom;
fracResult.m_nDenom = this->m_nDenom * fracR.m_nDenom;
return fracResult;
}
Thuộc tính đối tượng và phương thức

32
1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới

VC



Ví dụ

BB

Toán tử + được viết bên ngoài lớp
1
2
3
4
5
6
7
8
9
10
11
12
13
14

class CFraction
{
int m_nNum, m_nDenom;
public:
friend const CFraction operator+(const CFraction&, const CFraction&);

};
const CFraction operator+(const CFraction& fracL, const CFraction& fracR)
{
CFraction fracResult;
fracResult.m_nNum = fracL.m_nNum * fracR.m_nDenom

+ fracR.m_nNum * fracL.m_nDenom;
fracResult.m_nDenom = fracL.m_nDenom * fracR.m_nDenom;
return fracResult;
}
Thuộc tính đối tượng và phương thức

33
1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới

VC



Các toán tử có và không thể nạp chồng

BB

Danh sách các toán tử có thể nạp chồng
cho kiểu dữ liệu mới do người lập trình tự định nghĩa
+

-

*

/

%

^

&

|

~

!

=

<

>

+=

-=

*=

/=

%=

^=

&=

|=

<<

>>

>>=

<<=

==

!=

<=

>=

&&

||

++

--

->*

,

->

[]

()

new

new[]

delete

delete[]

Danh sách các toán tử không thể nạp chồng
cho kiểu dữ liệu mới do người lập trình tự định nghĩa
Một số toán tử của C

.

?:

sizeof

Một số toán tử của C++

::

.*

typeid

Thuộc tính đối tượng và phương thức

34
1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới

VC


BB

Một số quy ước và lời khuyên

Chỉ viết toán tử khi cần thiết (ví dụ làm chương trình
dễ xử lý và dễ đọc hơn…) và phù hợp với thực tế
(ví dụ toán tử nhân 2 ngày với nhau!)
Đảm bảo tính chất của toán tử giống như các tính
chất của các kiểu dữ liệu cơ sở (ví dụ toán tử + thực
hiện phép… trừ!)
Đảm bảo tính nhất quán giữa các cặp toán tử (ví dụ
== và !=, ++ và ++(int), > và <, …)
Ưu tiên viết bên trong lớp nếu phải truy xuất đến
các thành phần thuộc tính của lớp. Ngược lại, ưu
tiên viết bên ngoài lớp.
Thuộc tính đối tượng và phương thức

35
1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới

VC


BB

Một số quy ước và lời khuyên

Các toán tử 2 ngôi đối xứng thường được viết dưới
dạng hàm friend (ví dụ toán tử +, -, …)
Các toán tử lvalue phải được viết là phương thức
toán tử non-static ở bên trong lớp (ví dụ toán tử =,
[], (), ->, *=, ++, …)
Sử dụng tham chiếu const cho các đối tượng có
kích thước lớn.
Sử dụng toán tử () để truy xuất phần tử trong ma
trận nhiều chiều.
Tận dụng các phương thức tạo lập một tham số
phục vụ việc ép kiểu ngầm định.
Thuộc tính đối tượng và phương thức

36
1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới

VC


BB

Một số ví dụ minh họa

Toán tử gán
 C++ tự động cung cấp toán tử gán mặc định
cho lớp đối tượng mới.
 Chỉ được gán 2 đối tượng cùng lớp.
 Thực hiện theo cơ chế member-wise copy từ
đối tượng nguồn sang đối tượng đích theo
dạng bit-wise copy, do đó cần phải nạp chồng
khi thành phần dữ liệu là các biến con trỏ
sử dụng cấp phát bộ nhớ động.
 Không dùng hàm friend khi nạp chồng.
Thuộc tính đối tượng và phương thức

37
1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới

VC


BB

Một số ví dụ minh họa

Cài đặt toán tử gán cho lớp mảng cấp phát động
1
2
3
4
5
6
7
8
9
10
11
12
13

public:
CDynamicArray& operator=(const CDynamicArray& dynArr)
{
if (this != &dynArr)

// Tránh gán chính nó

{
delete []m_pnData;

// Xóa vùng nhớ đang giữ

m_nSize = dynArr.m_nSize;
m_pnData = new int[m_nSize];
for (int i = 0; i < m_nSize; i++)
m_pnData[i] = dynArr.m_pnData[i];
}
return *this;
}
Thuộc tính đối tượng và phương thức

38
1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới

VC



Một số ví dụ minh họa

BB

Toán tử chèn (insertion) <<
1
2
3
4
5
6
7
8
9
10
11
12

class CFraction
{
int m_nNum, m_nDenom;
public:
friend ostream& operator<<(ostream&, const CFraction&);

};
ostream& operator<<(ostream& os, const CFraction& frac)
{
os << frac.m_nNum << “/” << frac.m_nDenom;

return os;
}

Thuộc tính đối tượng và phương thức

39
1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới

VC



Một số ví dụ minh họa

BB

Toán tử trích (extraction) >>
1
2
3
4
5
6
7
8
9
10
11
12

class CFraction
{
int m_nNum, m_nDenom;
public:
friend istream& operator>>(istream&, CFraction&);

};
istream& operator>>(istream& is, CFraction& frac)
{
is >> frac.m_nNum >> frac.m_nDenom;

return is;
}

Thuộc tính đối tượng và phương thức

40
1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới

VC



Một số ví dụ minh họa

BB

Toán tử + viết sai (khác toán tử + gốc)
1
2
3
4
5
6
7
8
9
10
11
12
13

class CFraction
{
int m_nNum, m_nDenom;
public:
friend void operator+(CFraction&, const CFraction&);

};
void operator+(CFraction& fracL, const CFraction& fracR)
{
fracL.m_nNum = fracL.m_nNum * fracR.m_nDenom

+ fracR.m_nNum * fracL.m_nDenom;
fracL.m_nDenom = fracL.m_nDenom * fracR.m_nDenom;
}
Thuộc tính đối tượng và phương thức

41
1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới

VC



Một số ví dụ minh họa

BB

Toán tử ++ sau viết sai (khác toán tử ++ gốc)
1
2
3
4
5
6
7
8
9
10
11
12

class CFraction
{
int m_nNum, m_nDenom;
public:
CFraction& operator++(int);

// Toán tử ++ sau

};
CFraction& CFraction::operator++(int)
{
m_nNum = m_nNum + m_nDenom;

return *this;
}

Thuộc tính đối tượng và phương thức

42
1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới

VC



Một số ví dụ minh họa

BB

Toán tử ++ sau viết đúng (giống toán tử ++ gốc)
1
2
3
4
5
6
7
8
9
10
11
12
13

class CFraction
{

int m_nNum, m_nDenom;
public:
CFraction& operator++(int);

// Toán tử ++ sau

};

CFraction& CFraction::operator++(int)
{
CFraction fracResult = *this;
m_nNum = m_nNum + m_nDenom; //  ++(*this);
return fracResult;

}
Thuộc tính đối tượng và phương thức

43
1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới

VC


BB

Đối sánh giữa C++, Java và C#

Đọc thêm [OOP] trang 99-100.
 Các quy định nạp chồng toán tử.
 Các toán tử có thể nạp chồng.

Thuộc tính đối tượng và phương thức

44
1 2 3 4 5 6 7 Phương thức chuyển đổi kiểu dữ liệu (casting methods)

VC


BB

Khái niệm và phân loại

Khái niệm
 Ép kiểu (casting) là việc chuyển đổi các biến
từ kiểu dữ liệu này sang kiểu dữ liệu khác.
Phân loại (trong NNLT C++)
 Ép kiểu ngầm định (implicit casting)
 Ép kiểu chỉ định (explicit casting)
•

Ép kiểu theo chuẩn C (C-style casting), ép kiểu tĩnh (static_cast),
ép kiểu động (dynamic_cast), ép kiểu hằng (const_cast)
và ép kiểu dịch lại (reinterpret_cast)

 Phương thức ép kiểu tự định nghĩa
•

Ép kiểu bằng phương thức tạo lập và ép kiểu bằng toán tử.
Thuộc tính đối tượng và phương thức

45
1 2 3 4 5 6 7 Phương thức chuyển đổi kiểu dữ liệu (casting methods)

VC


BB

Ép kiểu ngầm định

Sự tăng cấp (kiểu dữ liệu) trong biểu thức (chỉ
chuyển đổi tạm thời, nội bộ)
 Các thành phần cùng kiểu thì kết quả là kiểu
chung, ví dụ:
•
•

2 / 4 => 0 (int / int => int)
2.0 / 4.0 => 0.5 (float / float => float)

 Các thành phần khác kiểu thì kết quả là kiểu
bao quát nhất (char < int < long < float <
double), ví dụ:
•

2.0 / 4 => 2.0 / 4.0 => 0.5
(float / int => float / float => float)
Thuộc tính đối tượng và phương thức

46
1 2 3 4 5 6 7 Phương thức chuyển đổi kiểu dữ liệu (casting methods)

VC


BB

Ép kiểu ngầm định

Trong phép gán, biểu thức ở vế phải luôn được
tăng cấp (hay giảm cấp) tạm thời cho giống biểu
thức ở vế trái và có thể làm mất tính chính xác
của số nguyên khi chuyển sang số thực!
1
2
3
4
5
6

int i, j = 3;
float f = 1.23;
i = f;

//  f tạm thời giảm cấp thành int

f = i;

//  i tạm thời nâng cấp thành float

f = j;

//  j tạm thời nâng cấp thành float, f = 2.999995

Thuộc tính đối tượng và phương thức

47
1 2 3 4 5 6 7 Phương thức chuyển đổi kiểu dữ liệu (casting methods)

VC


BB

Ép kiểu chỉ định

Xem chi tiết trong [OOP] trang 110-119.
 Ép kiểu theo chuẩn C (C-style casting).
 Ep kiểu tĩnh (static_cast).
 Ép kiểu động (dynamic_cast).
 Ép kiểu hằng (const_cast).
 Ép kiểu dịch lại (reinterpret_cast).

Thuộc tính đối tượng và phương thức

48
1 2 3 4 5 6 7 Phương thức chuyển đổi kiểu dữ liệu (casting methods)

VC



Phương thức ép kiểu tự định nghĩa

BB

Ép kiểu bằng phương thức tạo lập (1 tham số)
1
2
3
4
5
6
7
8
9
10
11
12
13
14

class CFraction
{
int m_nNum, m_nDenom;
public:
CFraction() { m_nNum = 0; m_nDenom = 1; }
CFraction(int nNum) { m_nNum = nNum; m_nDenom = 1; }
// Các phương thức khác…
};
void main()
{

CFraction frac1 = 2912;

//  CFraction(2912)

CFraction frac2;

//  CFraction()

frac2 = 1706;

//  CFraction(1706), operator=

}
Thuộc tính đối tượng và phương thức

49
1 2 3 4 5 6 7 Phương thức chuyển đổi kiểu dữ liệu (casting methods)

VC



Phương thức ép kiểu tự định nghĩa

BB

Ép kiểu dữ liệu bằng toán tử
1
2
3
4
5
6
7
8
9
10
11
12
13
14

class CFraction
{
int m_nNum, m_nDenom;
public:
CFraction(int nNum, int nDenom) { m_nNum = nNum; m_nDenom = nDenom; }
operator int() const { return m_nNum / m_nDenom; }
};
void main()
{
CFraction frac(2912, 1706);
int nResult1 = frac;

// Ép kiểu ngầm định

int nResult2 = int(frac);

// Ép kiểu chỉ định

int nResult3 = (int)frac;

// Ép kiểu chỉ định

}
Thuộc tính đối tượng và phương thức

50
1 2 3 4 5 6 7 Một số vấn đề liên quan khác

VC


BB

Thành phần tĩnh (static)

Khái niệm
 Thành phần dữ liệu tĩnh (static data member
hay class-level member) và phương thức tĩnh
(static method hay class-level method) của
lớp không phụ thuộc vào một đối tượng cụ
thể nào cả mà là thành phần chung cho tất cả
các đối tượng của lớp tương ứng.
Cú pháp
1
2

static type-name var-name;
static return-type method-name(param-list);

Thuộc tính đối tượng và phương thức

51
1 2 3 4 5 6 7 Một số vấn đề liên quan khác

VC



Thành phần tĩnh (static)

BB

Ví dụ
1
2
3
4
5
6
7
8
9
10
11
12
13
14

class CStaticTest
{
static int s_nCount;

// Số lượng đối tượng

public:
static int getCount() { return s_nCount; }
CStaticTest() { ++s_nCount; }
~CStaticTest() { --s_nCount; }
};

int CStaticTest::s_nCount = 0;

// Bỏ từ khóa static

void main()
{
CStaticTest staticTest1, staticTest2;
cout << “Number of objects: ” << CStaticTest::getCount();

}
Thuộc tính đối tượng và phương thức

52
1 2 3 4 5 6 7 Một số vấn đề liên quan khác

VC


BB

Thành phần dữ liệu có kiểu là lớp

Khi A có thành phần dữ liệu là một đối tượng có
kiểu thuộc lớp B thì:
 Khi A được tạo lập  Phương thức tạo lập
của lớp B được thực hiện trước.
 Khi A bị hủy  Phương thức hủy của lớp B
được thực hiện sau.
Ký hiệu UML (quan hệ association)
A

B

- b: B

Thuộc tính đối tượng và phương thức

53
1 2 3 4 5 6 7 Một số vấn đề liên quan khác

VC



Thành phần dữ liệu có kiểu là lớp

BB

Ví dụ
1
2
3
4
5
6
7
8
9
10
11
12
13
14

class CB
{

public:
CB() { cout << “Constructing CB...” << endl; }
~CB() { cout << “Destructing CB...” << endl; }
};
class CA

{
CB m_b;
public:
CA() { cout << “Constructing CA...” << endl; }
~CA() { cout << “Destructing CA...” << endl; }

};
void main() { CA a; }
Thuộc tính đối tượng và phương thức

54
1 2 3 4 5 6 7 Một số vấn đề liên quan khác

VC


BB

Danh sách khởi tạo (initializers)

Khái niệm
 Khởi tạo giá trị cho các thành phần dữ liệu
của lớp (thứ tự thực hiện trong khai báo lớp).
 Là cách duy nhất được sử dụng trong các
trường hợp không thể tạo lập giá trị ban đầu
cho các thành phần dữ liệu có kiểu hằng số,
tham chiếu hay đối tượng của lớp không có
phương thức tạo lập mặc định.
Cú pháp
1

class-name(param-list) : var-name-1(arg), var-name-2(arg)
Thuộc tính đối tượng và phương thức

55
1 2 3 4 5 6 7 Một số vấn đề liên quan khác

VC



Danh sách khởi tạo (initializers)

BB

Ví dụ
1
2
3
4
5
6
7
8
9
10
11
12
13
14

class CA
{

int m_nX;
public:
CA(int nX) { m_nX = nX; }
};
class CTest

{
const int m_nK;
CA& m_aRef;
CA m_a;
public:

CTest(int nK, A& aRef) : m_nK(nK), m_aRef(aRef), m_a(nK) { };
};
Thuộc tính đối tượng và phương thức

56
1 2 3 4 5 6 7 Một số vấn đề liên quan khác

VC


BB

Phương thức có thuộc tính const

Khái niệm
 Cam kết sẽ không làm thay đổi trạng thái hay
giá trị của các thành phần dữ liệu của lớp.
 Đối tượng bình thường có thể gọi được
phương thức bình thường hoặc const.
 Đối tượng const có thể gọi phương thức
const nhưng không thể gọi phương thức
bình thường.
Cú pháp
1

return-type method-name(param-list) const;
Thuộc tính đối tượng và phương thức

57
1 2 3 4 5 6 7 Một số vấn đề liên quan khác

VC



Phương thức có thuộc tính const

BB

Ví dụ
1
2
3
4
5
6
7
8
9
10
11
12
13
14

class CA
{

public:
void test() { }
void testConst() const { }
};
void doSomething(CA a1, const CA& a2)

{
a1.test();

// OK, a1 non-const

a1.testConst(); // OK, a1 non-const
a2.test();

// Lỗi, a2 const, test() non-const

a2.testConst(); // OK, testConst() const
}
Thuộc tính đối tượng và phương thức

58
1 2 3 4 5 6 7 Một số vấn đề liên quan khác

VC


BB

Luật bộ ba (rule of three)

Luật bộ ba (“rule of three”, “the Law of The Big
Three” hay “The Big Three”), được Marshall
Cline đề xuất năm 1991, là quy tắc trong C++
nói rằng “nếu một lớp đối tượng định nghĩa lại
một trong ba phương thức gồm phương thức
hủy – tạo lập sao chép – toán tử gán thì lớp đối
tượng này nên định nghĩa luôn cả ba phương
thức đó một cách tường minh”.
Thường được áp dụng trong các lớp đối tượng
có thuộc tính thành viên là con trỏ sử dụng bộ
nhớ được cấp phát động.
Thuộc tính đối tượng và phương thức

59
1 2 3 4 5 6 7 Áp dụng

VC


BB

Mẫu thiết kế Singleton và áp dụng

Mẫu thiết kế (design pattern)
 Là lời giải mẫu cho các bài toán giống nhau.
 Cuốn sách nổi tiếng “Design Patterns –
Elements of Reusable Object-Oriented
Software (năm 1994)
•

•

Nhóm 4 tác giả (Gang of Four
– GoF) bao gồm Erich Gamma,
Richard Helm, Ralph Johnson
và John Vlissides.
Gồm 23 mẫu thiết kế
(được gọi là mẫu GoF).
Thuộc tính đối tượng và phương thức

60
1 2 3 4 5 6 7 Áp dụng

VC


BB

Mẫu thiết kế Singleton và áp dụng

Khái niệm
 Là mẫu thiết kế trong lập trình hướng.
 Áp dụng mẫu này lên một lớp sẽ đảm bảo
lớp này chỉ có nhiều nhất một đối tượng
được tạo ra trong suốt chương trình.
Sơ đồ UML
CSingelton

- static CSingleton s_pInstance

CSingleton getInstance()
{
return s_pInstance;

- CSingleton()
+ getInstance(): CSingleton

}

Thuộc tính đối tượng và phương thức

61
1 2 3 4 5 6 7 Áp dụng

VC


BB

Mẫu thiết kế Singleton và áp dụng

Ý tưởng cài đặt (các vấn đề cần giải quyết)
 Đặt các phương thức tạo lập dạng private
để người dùng không thể tự ý tạo đối tượng
mới (phải định nghĩa phương thức tạo lập để
tránh sử dụng phương thức tạo lập mặc định)
 Tạo sẵn một đối tượng CSingleton duy nhất
(nếu có) ở dạng static để người dùng chỉ
được phép sử dụng đối tượng đã có sẵn này
(lấy đối tượng thông qua một phương thức
static mà ta cung cấp).
Thuộc tính đối tượng và phương thức

62
1 2 3 4 5 6 7 Áp dụng

VC



Mẫu thiết kế Singleton và áp dụng

BB

Cài đặt (nên chia mã nguồn thành nhiều tập tin)
1
2
3
4
5
6
7
8
9
10
11
12
13
14

class CSingleton
{

static CSingleton* s_pInstance;

// Đối tượng duy nhất

CSingleton() { }

// Phương thức tạo lập

public:
static CSingleton* getInstance();
};

CSingleton* CSingleton::s_pInstance = NULL;
static CSingleton* getInstance()

// Phương thức lấy

{

// đối tượng của lớp
if (s_pInstance == NULL) s_pInstance = new CSingleton();
return s_pInstance;

}
void main() { CSingleton* pObj = CSingleton::getInstance(); }
Thuộc tính đối tượng và phương thức

63
1 2 3 4 5 6 7 Áp dụng

VC


BB

Mẫu thiết kế Singleton và áp dụng

Thảo luận về các ứng dụng trong thực tế và
biến thể “Multi”-ton của mẫu Singleton.

Thuộc tính đối tượng và phương thức

64
1 2 3 4 5 6 7

VC


BB

Một số thuật ngữ

bitwise copy: tương tự như member-wise copy.
casting: ép kiểu.
const casting: ép kiểu hằng
constructor: phương thức tạo lập.
C-style casting: ép kiểu theo chuẩn C.
deep copy: khác với shallow copy, sao chép đầy đủ các thành
phần (kể cả sao chép các vùng nhớ mà các thành phần con trỏ
đang trỏ tới).
default constructor: phương thức tạo lập mặc định.
design pattern: mẫu thiết kế.
destructor: phương thức hủy.
dynamic casting: é kiểu động.
explicit casting: ép kiểu chỉ định.
Thuộc tính đối tượng và phương thức

65
1 2 3 4 5 6 7

VC


BB

Một số thuật ngữ

formal argument: tham số hình thức (gọi tắt là tham số).
implicit casting: ép kiểu ngầm định.
initializers: danh sách khởi tạo cho phương thức tạo lập.
member-wise copy: sao chép các thành viên.
operator: toán tử.
reinterpret casting: ép kiểu dịch lại.
shallow copy: tương tự như member-wise copy.
static casting: ép kiểu tĩnh.
static constructor: phương thức tạo lập tĩnh.
static member, class-level member: thành phần tinh của lớp,
chung cho mọi đối tượng của lớp.
static method, class-level method: phương thức tĩnh của lớp,
phương thức chung cho mọi đối tượng của lớp.
virtual method: phương thức ảo.
Thuộc tính đối tượng và phương thức

66
1 2 3 4 5 6 7

VC


BB

Tài liệu tham khảo

[OOP] Chương 3 – Thuộc tính đối tượng và
phương thức (trang 76-134)
[Primer] Chapter 10 – Objects and Classes
Class Constructors and Destructors (trang 463-476)
Knowing Your Objects: The this Pointer (trang 477-482)

[Primer] Chapter 11 – Working with Classes
Operator Overloading & Introducing Friends(trang 502-541)
Automatic Conversions and Type Casts
for Classes (trang 541-556)

[Primer] Chapter 15 – Friends, Exceptions, and More
Type Cast Operators (trang 848-852)
Thuộc tính đối tượng và phương thức

67
1 2 3 4 5 6 7

VC


BB

Bài tập

Bài tập 4.1: Cài đặt lớp đồng hồ bấm giờ để xác
định thời gian (số giây) trôi qua (CStopWatch)
hỗ trợ một số hành động như sau:
 Tự động thiết lập thời gian ban đầu bằng 0.
 Bắt đầu (start), dừng hẳn (stop), tạm dừng
(pause), tiếp tục (resume) tính thời gian trôi qua.
 Hiển thị (show) thời gian đã trôi qua ở lần gần
nhất (tự động gọi mỗi khi pause và stop).
 Tự động hiển thị thời gian đã trôi qua từ khi
bắt đầu sinh ra đến khi khi đối tượng bị hủy.
Thuộc tính đối tượng và phương thức

68
1 2 3 4 5 6 7

VC


BB

Bài tập

Bài tập 4.2 đến 4.6: Bổ sung các phương thức
tạo lập, phương thức hủy thích hợp và nạp
chồng các toán tử cơ bản cho các bài tập:
 2.6: Lớp phân số (CFraction).
 2.7: Lớp đơn thức (CMonomial).
 2.10: Lớp ngày (CDate).
 3.1: Lớp học sinh (CStudent) sử dụng lớp
string.
 3.2: Lớp mảng (CDynamicArray) sử dụng lớp
vector.
Thuộc tính đối tượng và phương thức

69
1 2 3 4 5 6 7

VC


BB

Bài tập

Bài tập 4.7: Xây dựng lớp số phức (CComplex)
hỗ trợ một số phương thức cơ bản (bao gồm
các phương thức tạo lập và phương thức hủy)
và nạp chồng các toán tử cơ bản.
Bài tập 4.8: Cài đặt lớp các thuật toán sắp xếp
tăng dần các số thực (CSingleSortAlgorithm)
chỉ cho phép thực hiện một phương pháp
sắp xếp đã chọn cho toàn bộ chương trình.
Bài tập 4.9: Cài đặt lớp cung cấp các thuật toán
sắp xếp tăng dần không cần tạo ra đối tượng
khi sử dụng (CStaticSortAlgorithm).
Thuộc tính đối tượng và phương thức

70

More Related Content

What's hot

Phần 12: Hàm (Nâng cao)
Phần 12: Hàm (Nâng cao)Phần 12: Hàm (Nâng cao)
Phần 12: Hàm (Nâng cao)Huy Rùa
 
Phần 11: Tập tin
Phần 11: Tập tinPhần 11: Tập tin
Phần 11: Tập tinHuy Rùa
 
Phần 8: Mảng hai chiều
Phần 8: Mảng hai chiềuPhần 8: Mảng hai chiều
Phần 8: Mảng hai chiềuHuy Rùa
 
Nmlt c01 cac_khainiemcobanvelaptrinh
Nmlt c01 cac_khainiemcobanvelaptrinhNmlt c01 cac_khainiemcobanvelaptrinh
Nmlt c01 cac_khainiemcobanvelaptrinhMinh Ngoc Tran
 
Phần 1: Các khái niệm cơ bản về lập trình
Phần 1: Các khái niệm cơ bản về lập trìnhPhần 1: Các khái niệm cơ bản về lập trình
Phần 1: Các khái niệm cơ bản về lập trìnhHuy Rùa
 
Nmlt c02 gioi_thieunnltc
Nmlt c02 gioi_thieunnltcNmlt c02 gioi_thieunnltc
Nmlt c02 gioi_thieunnltcMinh Ngoc Tran
 
Lap trinh huong_doi_tuong_cpp_dhct_lesson09
Lap trinh huong_doi_tuong_cpp_dhct_lesson09Lap trinh huong_doi_tuong_cpp_dhct_lesson09
Lap trinh huong_doi_tuong_cpp_dhct_lesson09xcode_esvn
 
Phần 2: Giới thiệu ngôn ngữ lập trình C
Phần 2: Giới thiệu ngôn ngữ lập trình CPhần 2: Giới thiệu ngôn ngữ lập trình C
Phần 2: Giới thiệu ngôn ngữ lập trình CHuy Rùa
 
Phần 5: Câu lệnh lặp
Phần 5: Câu lệnh lặpPhần 5: Câu lệnh lặp
Phần 5: Câu lệnh lặpHuy Rùa
 
Jniについて
JniについてJniについて
JniについてChu Chu
 
Nmlt c11 con_trocoban-
Nmlt c11 con_trocoban-Nmlt c11 con_trocoban-
Nmlt c11 con_trocoban-Minh Ngoc Tran
 
Bài giảng Lập trình cơ bản - truongkinhtethucpham.com
Bài giảng Lập trình cơ bản - truongkinhtethucpham.comBài giảng Lập trình cơ bản - truongkinhtethucpham.com
Bài giảng Lập trình cơ bản - truongkinhtethucpham.commai_non
 

What's hot (20)

Chuong5 (2)
Chuong5 (2)Chuong5 (2)
Chuong5 (2)
 
Phần 12: Hàm (Nâng cao)
Phần 12: Hàm (Nâng cao)Phần 12: Hàm (Nâng cao)
Phần 12: Hàm (Nâng cao)
 
Phần 11: Tập tin
Phần 11: Tập tinPhần 11: Tập tin
Phần 11: Tập tin
 
Phần 8: Mảng hai chiều
Phần 8: Mảng hai chiềuPhần 8: Mảng hai chiều
Phần 8: Mảng hai chiều
 
Nmlt c01 cac_khainiemcobanvelaptrinh
Nmlt c01 cac_khainiemcobanvelaptrinhNmlt c01 cac_khainiemcobanvelaptrinh
Nmlt c01 cac_khainiemcobanvelaptrinh
 
Phần 1: Các khái niệm cơ bản về lập trình
Phần 1: Các khái niệm cơ bản về lập trìnhPhần 1: Các khái niệm cơ bản về lập trình
Phần 1: Các khái niệm cơ bản về lập trình
 
C# coban
C# cobanC# coban
C# coban
 
Chuong3 c
Chuong3 c Chuong3 c
Chuong3 c
 
Nmlt c02 gioi_thieunnltc
Nmlt c02 gioi_thieunnltcNmlt c02 gioi_thieunnltc
Nmlt c02 gioi_thieunnltc
 
Lập trình hướng đối tượng - p2
Lập trình hướng đối tượng - p2Lập trình hướng đối tượng - p2
Lập trình hướng đối tượng - p2
 
Lap trinh huong_doi_tuong_cpp_dhct_lesson09
Lap trinh huong_doi_tuong_cpp_dhct_lesson09Lap trinh huong_doi_tuong_cpp_dhct_lesson09
Lap trinh huong_doi_tuong_cpp_dhct_lesson09
 
Mang1 chieu
Mang1 chieuMang1 chieu
Mang1 chieu
 
Nmlt c11 con_trocoban
Nmlt c11 con_trocobanNmlt c11 con_trocoban
Nmlt c11 con_trocoban
 
Phần 2: Giới thiệu ngôn ngữ lập trình C
Phần 2: Giới thiệu ngôn ngữ lập trình CPhần 2: Giới thiệu ngôn ngữ lập trình C
Phần 2: Giới thiệu ngôn ngữ lập trình C
 
Chuong 4
Chuong 4Chuong 4
Chuong 4
 
Phần 5: Câu lệnh lặp
Phần 5: Câu lệnh lặpPhần 5: Câu lệnh lặp
Phần 5: Câu lệnh lặp
 
Jniについて
JniについてJniについて
Jniについて
 
Nmlt c11 con_trocoban-
Nmlt c11 con_trocoban-Nmlt c11 con_trocoban-
Nmlt c11 con_trocoban-
 
Bài giảng Lập trình cơ bản - truongkinhtethucpham.com
Bài giảng Lập trình cơ bản - truongkinhtethucpham.comBài giảng Lập trình cơ bản - truongkinhtethucpham.com
Bài giảng Lập trình cơ bản - truongkinhtethucpham.com
 
C9 templates
C9 templatesC9 templates
C9 templates
 

Similar to Pplthdt c04 thuoc_tinhdoituong_phuongthuc_v13.09a

Nmlt c10 cau_truc_in
Nmlt c10 cau_truc_inNmlt c10 cau_truc_in
Nmlt c10 cau_truc_inHuy Nguyễn
 
Ctdl C01
Ctdl C01Ctdl C01
Ctdl C01giang
 
Pplthdt c01 mot_sovandetronglaptrinh_v13.09a
Pplthdt c01 mot_sovandetronglaptrinh_v13.09aPplthdt c01 mot_sovandetronglaptrinh_v13.09a
Pplthdt c01 mot_sovandetronglaptrinh_v13.09aPix Nhox
 
Pdfc fast food-mastercode.vn
Pdfc fast food-mastercode.vnPdfc fast food-mastercode.vn
Pdfc fast food-mastercode.vnMasterCode.vn
 
Phần 10: Dữ liệu kiểu cấu trúc
Phần 10: Dữ liệu kiểu cấu trúcPhần 10: Dữ liệu kiểu cấu trúc
Phần 10: Dữ liệu kiểu cấu trúcHuy Rùa
 
Nmlt c12 quan_lybonho_in
Nmlt c12 quan_lybonho_inNmlt c12 quan_lybonho_in
Nmlt c12 quan_lybonho_inHuy Nguyễn
 
Phan 2 chuong 9 (cau truc)
Phan 2   chuong 9 (cau truc)Phan 2   chuong 9 (cau truc)
Phan 2 chuong 9 (cau truc)Trần Văn Nam
 
Ch02 - Cau truc chuong trinh C.pptx
Ch02 - Cau truc chuong trinh C.pptxCh02 - Cau truc chuong trinh C.pptx
Ch02 - Cau truc chuong trinh C.pptxducanh18022004
 
Cq lt hdt-th2011-02-tuan04
Cq lt hdt-th2011-02-tuan04Cq lt hdt-th2011-02-tuan04
Cq lt hdt-th2011-02-tuan04. .
 
Nmlt c07 mang1_chieu_in
Nmlt c07 mang1_chieu_inNmlt c07 mang1_chieu_in
Nmlt c07 mang1_chieu_inHuy Nguyễn
 

Similar to Pplthdt c04 thuoc_tinhdoituong_phuongthuc_v13.09a (20)

Nmlt c10 cau_truc_in
Nmlt c10 cau_truc_inNmlt c10 cau_truc_in
Nmlt c10 cau_truc_in
 
Nmlt c10 cau_truc
Nmlt c10 cau_trucNmlt c10 cau_truc
Nmlt c10 cau_truc
 
Tut6 solution
Tut6 solutionTut6 solution
Tut6 solution
 
Ctdl C01
Ctdl C01Ctdl C01
Ctdl C01
 
Pplthdt c01 mot_sovandetronglaptrinh_v13.09a
Pplthdt c01 mot_sovandetronglaptrinh_v13.09aPplthdt c01 mot_sovandetronglaptrinh_v13.09a
Pplthdt c01 mot_sovandetronglaptrinh_v13.09a
 
Pdfc fast food-mastercode.vn
Pdfc fast food-mastercode.vnPdfc fast food-mastercode.vn
Pdfc fast food-mastercode.vn
 
Giáo trình c#
Giáo trình c#Giáo trình c#
Giáo trình c#
 
Phần 10: Dữ liệu kiểu cấu trúc
Phần 10: Dữ liệu kiểu cấu trúcPhần 10: Dữ liệu kiểu cấu trúc
Phần 10: Dữ liệu kiểu cấu trúc
 
Bai tap thuc hanh
Bai tap thuc hanhBai tap thuc hanh
Bai tap thuc hanh
 
Chuong1 c
Chuong1 c Chuong1 c
Chuong1 c
 
Nmlt c12 quan_lybonho_in
Nmlt c12 quan_lybonho_inNmlt c12 quan_lybonho_in
Nmlt c12 quan_lybonho_in
 
Phan 2 chuong 9 (cau truc)
Phan 2   chuong 9 (cau truc)Phan 2   chuong 9 (cau truc)
Phan 2 chuong 9 (cau truc)
 
Nmlt c12 quan_lybonho
Nmlt c12 quan_lybonhoNmlt c12 quan_lybonho
Nmlt c12 quan_lybonho
 
Ch02 - Cau truc chuong trinh C.pptx
Ch02 - Cau truc chuong trinh C.pptxCh02 - Cau truc chuong trinh C.pptx
Ch02 - Cau truc chuong trinh C.pptx
 
Chapter 2
Chapter 2Chapter 2
Chapter 2
 
Lập trình hướng đối tượng - p3
Lập trình hướng đối tượng - p3Lập trình hướng đối tượng - p3
Lập trình hướng đối tượng - p3
 
C9 templates
C9 templatesC9 templates
C9 templates
 
Cq lt hdt-th2011-02-tuan04
Cq lt hdt-th2011-02-tuan04Cq lt hdt-th2011-02-tuan04
Cq lt hdt-th2011-02-tuan04
 
Nmlt c07 mang1_chieu_in
Nmlt c07 mang1_chieu_inNmlt c07 mang1_chieu_in
Nmlt c07 mang1_chieu_in
 
Chapter 3
Chapter 3Chapter 3
Chapter 3
 

Recently uploaded

GIÁO TRÌNH KHỐI NGUỒN CÁC LOẠI - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
GIÁO TRÌNH  KHỐI NGUỒN CÁC LOẠI - ĐIỆN LẠNH BÁCH KHOA HÀ NỘIGIÁO TRÌNH  KHỐI NGUỒN CÁC LOẠI - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
GIÁO TRÌNH KHỐI NGUỒN CÁC LOẠI - ĐIỆN LẠNH BÁCH KHOA HÀ NỘIĐiện Lạnh Bách Khoa Hà Nội
 
Đề cương môn giải phẫu......................
Đề cương môn giải phẫu......................Đề cương môn giải phẫu......................
Đề cương môn giải phẫu......................TrnHoa46
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...Nguyen Thanh Tu Collection
 
TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI LÝ LUẬN VĂN HỌC NĂM HỌC 2023-2024 - MÔN NGỮ ...
TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI LÝ LUẬN VĂN HỌC NĂM HỌC 2023-2024 - MÔN NGỮ ...TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI LÝ LUẬN VĂN HỌC NĂM HỌC 2023-2024 - MÔN NGỮ ...
TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI LÝ LUẬN VĂN HỌC NĂM HỌC 2023-2024 - MÔN NGỮ ...Nguyen Thanh Tu Collection
 
PHÁT TRIỂN DU LỊCH BỀN VỮNG Ở TUYÊN QUANG
PHÁT TRIỂN DU LỊCH BỀN VỮNG Ở TUYÊN QUANGPHÁT TRIỂN DU LỊCH BỀN VỮNG Ở TUYÊN QUANG
PHÁT TRIỂN DU LỊCH BỀN VỮNG Ở TUYÊN QUANGhoinnhgtctat
 
sách sinh học đại cương - Textbook.pdf
sách sinh học đại cương   -   Textbook.pdfsách sinh học đại cương   -   Textbook.pdf
sách sinh học đại cương - Textbook.pdfTrnHoa46
 
Campbell _2011_ - Sinh học - Tế bào - Ref.pdf
Campbell _2011_ - Sinh học - Tế bào - Ref.pdfCampbell _2011_ - Sinh học - Tế bào - Ref.pdf
Campbell _2011_ - Sinh học - Tế bào - Ref.pdfTrnHoa46
 
Chuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdf
Chuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdfChuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdf
Chuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdfhoangtuansinh1
 
TỔNG HỢP ĐỀ THI CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN NĂM ...
TỔNG HỢP ĐỀ THI CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN NĂM ...TỔNG HỢP ĐỀ THI CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN NĂM ...
TỔNG HỢP ĐỀ THI CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN NĂM ...Nguyen Thanh Tu Collection
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...Nguyen Thanh Tu Collection
 
Các điều kiện bảo hiểm trong bảo hiểm hàng hoá
Các điều kiện bảo hiểm trong bảo hiểm hàng hoáCác điều kiện bảo hiểm trong bảo hiểm hàng hoá
Các điều kiện bảo hiểm trong bảo hiểm hàng hoámyvh40253
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...Nguyen Thanh Tu Collection
 
chuong-7-van-de-gia-dinh-trong-thoi-ky-qua-do-len-cnxh.pdf
chuong-7-van-de-gia-dinh-trong-thoi-ky-qua-do-len-cnxh.pdfchuong-7-van-de-gia-dinh-trong-thoi-ky-qua-do-len-cnxh.pdf
chuong-7-van-de-gia-dinh-trong-thoi-ky-qua-do-len-cnxh.pdfVyTng986513
 
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 7 GLOBAL SUCCESS (2 CỘ...
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 7 GLOBAL SUCCESS (2 CỘ...GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 7 GLOBAL SUCCESS (2 CỘ...
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 7 GLOBAL SUCCESS (2 CỘ...Nguyen Thanh Tu Collection
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...Nguyen Thanh Tu Collection
 
powerpoint lịch sử đảng cộng sản việt nam.pptx
powerpoint lịch sử đảng cộng sản việt nam.pptxpowerpoint lịch sử đảng cộng sản việt nam.pptx
powerpoint lịch sử đảng cộng sản việt nam.pptxAnAn97022
 
BỘ ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
BỘ ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...BỘ ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
BỘ ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...Nguyen Thanh Tu Collection
 
3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘIĐiện Lạnh Bách Khoa Hà Nội
 
1.DOANNGOCPHUONGTHAO-APDUNGSTEMTHIETKEBTHHHGIUPHSHOCHIEUQUA (1).docx
1.DOANNGOCPHUONGTHAO-APDUNGSTEMTHIETKEBTHHHGIUPHSHOCHIEUQUA (1).docx1.DOANNGOCPHUONGTHAO-APDUNGSTEMTHIETKEBTHHHGIUPHSHOCHIEUQUA (1).docx
1.DOANNGOCPHUONGTHAO-APDUNGSTEMTHIETKEBTHHHGIUPHSHOCHIEUQUA (1).docxTHAO316680
 

Recently uploaded (20)

GIÁO TRÌNH KHỐI NGUỒN CÁC LOẠI - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
GIÁO TRÌNH  KHỐI NGUỒN CÁC LOẠI - ĐIỆN LẠNH BÁCH KHOA HÀ NỘIGIÁO TRÌNH  KHỐI NGUỒN CÁC LOẠI - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
GIÁO TRÌNH KHỐI NGUỒN CÁC LOẠI - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
 
Đề cương môn giải phẫu......................
Đề cương môn giải phẫu......................Đề cương môn giải phẫu......................
Đề cương môn giải phẫu......................
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
 
TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI LÝ LUẬN VĂN HỌC NĂM HỌC 2023-2024 - MÔN NGỮ ...
TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI LÝ LUẬN VĂN HỌC NĂM HỌC 2023-2024 - MÔN NGỮ ...TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI LÝ LUẬN VĂN HỌC NĂM HỌC 2023-2024 - MÔN NGỮ ...
TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI LÝ LUẬN VĂN HỌC NĂM HỌC 2023-2024 - MÔN NGỮ ...
 
PHÁT TRIỂN DU LỊCH BỀN VỮNG Ở TUYÊN QUANG
PHÁT TRIỂN DU LỊCH BỀN VỮNG Ở TUYÊN QUANGPHÁT TRIỂN DU LỊCH BỀN VỮNG Ở TUYÊN QUANG
PHÁT TRIỂN DU LỊCH BỀN VỮNG Ở TUYÊN QUANG
 
sách sinh học đại cương - Textbook.pdf
sách sinh học đại cương   -   Textbook.pdfsách sinh học đại cương   -   Textbook.pdf
sách sinh học đại cương - Textbook.pdf
 
Campbell _2011_ - Sinh học - Tế bào - Ref.pdf
Campbell _2011_ - Sinh học - Tế bào - Ref.pdfCampbell _2011_ - Sinh học - Tế bào - Ref.pdf
Campbell _2011_ - Sinh học - Tế bào - Ref.pdf
 
Chuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdf
Chuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdfChuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdf
Chuong trinh dao tao Su pham Khoa hoc tu nhien, ma nganh - 7140247.pdf
 
TỔNG HỢP ĐỀ THI CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN NĂM ...
TỔNG HỢP ĐỀ THI CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN NĂM ...TỔNG HỢP ĐỀ THI CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN NĂM ...
TỔNG HỢP ĐỀ THI CHÍNH THỨC KỲ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN NĂM ...
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
 
Các điều kiện bảo hiểm trong bảo hiểm hàng hoá
Các điều kiện bảo hiểm trong bảo hiểm hàng hoáCác điều kiện bảo hiểm trong bảo hiểm hàng hoá
Các điều kiện bảo hiểm trong bảo hiểm hàng hoá
 
1 - MÃ LỖI SỬA CHỮA BOARD MẠCH BẾP TỪ.pdf
1 - MÃ LỖI SỬA CHỮA BOARD MẠCH BẾP TỪ.pdf1 - MÃ LỖI SỬA CHỮA BOARD MẠCH BẾP TỪ.pdf
1 - MÃ LỖI SỬA CHỮA BOARD MẠCH BẾP TỪ.pdf
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
 
chuong-7-van-de-gia-dinh-trong-thoi-ky-qua-do-len-cnxh.pdf
chuong-7-van-de-gia-dinh-trong-thoi-ky-qua-do-len-cnxh.pdfchuong-7-van-de-gia-dinh-trong-thoi-ky-qua-do-len-cnxh.pdf
chuong-7-van-de-gia-dinh-trong-thoi-ky-qua-do-len-cnxh.pdf
 
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 7 GLOBAL SUCCESS (2 CỘ...
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 7 GLOBAL SUCCESS (2 CỘ...GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 7 GLOBAL SUCCESS (2 CỘ...
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 7 GLOBAL SUCCESS (2 CỘ...
 
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
30 ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
 
powerpoint lịch sử đảng cộng sản việt nam.pptx
powerpoint lịch sử đảng cộng sản việt nam.pptxpowerpoint lịch sử đảng cộng sản việt nam.pptx
powerpoint lịch sử đảng cộng sản việt nam.pptx
 
BỘ ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
BỘ ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...BỘ ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
BỘ ĐỀ PHÁT TRIỂN THEO CẤU TRÚC ĐỀ MINH HỌA BGD NGÀY 22-3-2024 KỲ THI TỐT NGHI...
 
3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
 
1.DOANNGOCPHUONGTHAO-APDUNGSTEMTHIETKEBTHHHGIUPHSHOCHIEUQUA (1).docx
1.DOANNGOCPHUONGTHAO-APDUNGSTEMTHIETKEBTHHHGIUPHSHOCHIEUQUA (1).docx1.DOANNGOCPHUONGTHAO-APDUNGSTEMTHIETKEBTHHHGIUPHSHOCHIEUQUA (1).docx
1.DOANNGOCPHUONGTHAO-APDUNGSTEMTHIETKEBTHHHGIUPHSHOCHIEUQUA (1).docx
 

Pplthdt c04 thuoc_tinhdoituong_phuongthuc_v13.09a

  • 1. class Bộ môn Công nghệ phần mềm Khoa Công nghệ thông tin Trường Đại học Khoa học Tự nhiên VCBB© 19.03a operator true public C++ PP LT HƯỚNG ĐỐI TƯỢNG cout catch ThS. Đặng Bình Phương this dbphuong@fit.hcmus.edu.vn THUỘC TÍNH ĐỐI TƯỢNG & PHƯƠNG THỨC inline new cin friend STL bool using OOP try virtual false private throw delete 1
  • 2. 1 2 3 4 5 6 7 VC  BB Nội dung Phương thức tạo lập (constructor) Phương thức hủy (destructor) Tham số của phương thức Định nghĩa phép toán (operator) cho kiểu dữ liệu mới Phương thức chuyển đổi kiểu dữ liệu (casting method) Một số vấn đề liên quan khác Mẫu thiết kế Singleton và áp dụng #include <iostream> using namespace std; void main() { cout << “Hello World”; cout << endl; Thuộc tính đối tượng và phương thức 2
  • 3. 1 2 3 4 5 6 7 Phương thức tạo lập (constructor) VC  BB Nhu cầu Thuộc tính đối tượng và phương thức 3
  • 4. 1 2 3 4 5 6 7 Phương thức tạo lập (constructor) VC  BB Đặc điểm (trong NNLT C++) Tên trùng với tên lớp và không có kiểu trả về. Tự động thực thi khi đối tượng được tạo nhằm khởi tạo dữ liệu và chuẩn bị những công việc cần thiết để bắt đầu chu kỳ sống của đối tượng. Có thể có nhiều phương thức tạo lập nạp chồng nhau (overloading) được phân biệt theo quy tắc như việc chồng các hàm (phân biệt nhờ danh sách tham số truyền vào). Tạo lập Sử dụng Hủy Thuộc tính đối tượng và phương thức 4
  • 5. 1 2 3 4 5 6 7 Phương thức tạo lập (constructor) VC  BB Phân loại Phương thức tạo lập mặc định (default constructor)  Không có tham số đầu vào.  Được tự động tạo ra nếu lớp không có bất kỳ phương thức tạo lập nào được định nghĩa. Phương thức tạo lập sao chép (copy constructor)  Để tạo ra một đối tượng từ một đối tượng có sẵn. Phương thức tạo lập người lập trình định nghĩa  Có thể quy định các tham số đầu vào khác nhau để khởi tạo dữ liệu cho đối tượng. Thuộc tính đối tượng và phương thức 5
  • 6. 1 2 3 4 5 6 7 Phương thức tạo lập (constructor) VC  Cú pháp khai báo và định nghĩa BB Khai báo phương thức tạo lập (tổng quát) 1 class-name(param-list); Định nghĩa phương thức tạo lập 1 2 3 4 5 class-name::class-name(param-list) { // Khởi tạo dữ liệu và chuẩn bị những công việc // cần thiết để bắt đầu chu kỳ sống của đối tượng… } Thuộc tính đối tượng và phương thức 6
  • 7. 1 2 3 4 5 6 7 Phương thức tạo lập (constructor) VC  Ví dụ BB Khai báo lớp CFraction (tập tin Fraction.h) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #ifndef _FRACTION_H #define _FRACTION_H class CFraction { int m_nNum; // Tử số (numerator) int m_nDenom; // Mẫu số (denominator) public: CFraction(); // Phương thức tạo lập mặc định CFraction(int); // Phương thức tạo lập dạng tử/1 CFraction(int, int); // Phương thức tạo lập dạng tử/mẫu }; #endif Thuộc tính đối tượng và phương thức 7
  • 8. 1 2 3 4 5 6 7 Phương thức tạo lập (constructor) VC  Ví dụ BB Cài đặt lớp CFraction (tập tin Fraction.cpp) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include “Fraction.h” // Phương thức tạo lập mặc định (default constructor) CFraction::CFraction() { m_nNum = 0; m_nDenom = 1; } // Phương thức tạo lập dạng tử/1 CFraction::CFraction(int nNum) { m_nNum = nNum; m_nDenom = 1; } // Phương thức tạo lập dạng tử/mẫu CFraction::CFraction(int nNum, int nDenom) { if (nDenom < 0) { nNum = -nNum; nDenom = -nDenom; } if (nDenom == 0) { nDenom = 1; } m_nNum = nNum; m_nDenom = nDenom; } Thuộc tính đối tượng và phương thức 8
  • 9. 1 2 3 4 5 6 7 Phương thức tạo lập (constructor) VC  BB Ví dụ Một số khai báo hợp lệ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 CFraction frac1; //  () CFraction frac2(1506); //  (int) CFraction frac3(12, 8); //  (int, int) CFraction* pFrac1 = new CFraction; //  new CFraction() CFraction* pFrac2 = new CFraction(1506); //  (int) CFraction* pFrac3 = new CFraction(12, 8);//  (int, int) CFraction aFrac1[2]; //  () x 2 CFraction aFrac2[2] = {2912, 1706}; //  (int) x 2 CFraction aFrac3[2] = {CFraction(2912), CFraction(1706)}; CFraction aFrac4[2] = {CFraction(369), CFraction(156, 128)}; CFraction* paFrac = new CFraction[2]; //  () x 2 Thuộc tính đối tượng và phương thức 9
  • 10. 1 2 3 4 5 6 7 Phương thức tạo lập (constructor) VC  BB Phương thức tạo lập sao chép Khái niệm  Khởi tạo đối tượng của một lớp dựa trên việc sao chép một đối tượng sẵn có của lớp đó (không áp dụng cho phép gán).  Được thực thi khi truyền hoặc trả về đối tượng của lớp đó theo kiểu tham trị. Ví dụ 1 2 3 4 5 CFraction doSomething(CFraction frac) { /* Xử lý… */ } CFraction frac1(82, 85), frac2; CFraction frac3(frac1); // Khởi tạo frac3 từ frac1 CFraction frac4 = frac1; // Khởi tạo frac4 từ frac1 frac2 = doSomething(frac1); // Khởi tạo khi truyền và trả Thuộc tính đối tượng và phương thức 10
  • 11. 1 2 3 4 5 6 7 Phương thức tạo lập (constructor) VC  BB Phương thức tạo lập sao chép mặc định Trong C++, phương thức tạo lập sao chép mặc định (default copy constructor) được tự động sinh ra cho lớp đối tượng do người lập trình tự định nghĩa và giúp sao chép từng thành phần thuộc tính (member-wise copy) từ đối tượng nguồn sang đối tượng đích theo dạng từng bit (bit-wise copy). Nếu các thành phần dữ liệu là các kiểu con trỏ thì quá trình sao chép sẽ chỉ sao chép địa chỉ của con trỏ (shallow copy) chứ không thật sự sao chép vùng nhớ mà chúng quản lý (deep copy). Thuộc tính đối tượng và phương thức 11
  • 12. 1 2 3 4 5 6 7 Phương thức tạo lập (constructor) VC  BB Hình ảnh minh họa : CFraction : CFraction - m_nNum: int - m_nNum: int - m_nDenom: int - m_nDenom: int : CDynamicArray : CDynamicArray - m_nSize: int - m_nSize: int - m_pData: int* - m_pData: int* Vùng nhớ Vùng nhớ chứa dữ liệu đã bị hủy Thuộc tính đối tượng và phương thức 12
  • 13. 1 2 3 4 5 6 7 Phương thức tạo lập (constructor) VC  BB Cài đặt phương thức tạo lập sao chép Khai báo phương thức tạo lập sao chép 1 class-name(const class-name&); Lưu ý  Nếu tham số được khai báo ở dạng tham trị thì phương thức tạo lập sao chép lại được kích hoạt để sao chép đối tượng này  lỗi do sử dụng phương thức đang được định nghĩa!  Việc sử dụng tham chiếu (&) kết hợp với const (pass-by-reference-to-const) để đối tượng không bị sao chép và bị thay đổi. Thuộc tính đối tượng và phương thức 13
  • 14. 1 2 3 4 5 6 7 Phương thức tạo lập (constructor) VC  Cài đặt phương thức tạo lập sao chép BB Ví dụ cài đặt cho lớp mảng động 1 2 3 4 5 6 7 8 9 10 11 12 13 class CDynamicArray { int m_nSize; int* m_panData; public: CDynamicArray(const CDynamicArray&); }; CDynamicArray::CDynamicArray(const CDynamicArray& dynArr) { m_nSize = dynArr.m_nSize; m_panData = new int[m_nSize]; for (int i = 0; i < m_nSize; i++) m_panData[i] = dynArr.m_pansData[i]; } Thuộc tính đối tượng và phương thức 14
  • 15. 1 2 3 4 5 6 7 Phương thức tạo lập (constructor) VC  BB Đối sánh giữa C++, Java và C# Đọc thêm [OOP] trang 83-87.  Chuỗi phương thức tạo lập (constructor chaining).  Phương thức tạo lập trong kế thừa.  Xử lý khi có lỗi trong phương thức tạo lập.  Phương thức tạo lập sao chép mặc định.  Phương thức tạo lập tĩnh. Thuộc tính đối tượng và phương thức 15
  • 16. 1 2 3 4 5 6 7 Phương thức hủy (destructor) VC  BB Nhu cầu Thuộc tính đối tượng và phương thức 16
  • 17. 1 2 3 4 5 6 7 Phương thức hủy (destructor) VC  BB Đặc điểm (trong NNLT C++) Tên trùng với tên lớp và có dấu ~ ở phía trước. Không có tham số đầu vào và giá trị trả về. Mỗi lớp chỉ có duy nhất một phương thức hủy. Tự động thực hiện mỗi khi đối tượng của lớp bị hủy (hết phạm vi sử dụng). Chỉ được thực hiện một lần duy nhất trong chu kỳ sống của đối tượng. Trình biên dịch sẽ tự động tạo phương thức hủy mặc định (default destructor, không làm gì cả) nếu lớp không có phương thức hủy nào. Thuộc tính đối tượng và phương thức 17
  • 18. 1 2 3 4 5 6 7 Phương thức hủy (destructor) VC  Cú pháp khai báo và định nghĩa BB Khai báo phương thức hủy 1 ~class-name(); Định nghĩa phương thức hủy 1 2 3 4 class-name::~class-name() { // Giải phóng tài nguyên đã cấp phát cho đối tượng… } Thuộc tính đối tượng và phương thức 18
  • 19. 1 2 3 4 5 6 7 Phương thức hủy (destructor) VC  Ví dụ BB Cài đặt phương thức hủy cho lớp mảng động 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class CDynamicArray { int m_nSize; int* m_panData; public: ~CDynamicArray(); }; CDynamicArray::~CDynamicArray() { if (m_nSize > 0) { m_nSize = 0; delete []m_panData; } } Thuộc tính đối tượng và phương thức 19
  • 20. 1 2 3 4 5 6 7 Phương thức hủy (destructor) VC  Ví dụ BB Cài đặt lớp CTimer 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include <ctime> class CTimer { clock_t m_clockStart; public: CTimer() { m_clockStart = clock(); } ~CTimer() { clock_t clockEnd = clock(); cout << “Elapsed time: ” << (clockEnd – m_clockStart) << endl; } }; Thuộc tính đối tượng và phương thức 20
  • 21. 1 2 3 4 5 6 7 Phương thức hủy (destructor) VC  BB Đối sánh giữa C++, Java và C# Đọc thêm [OOP] trang 90.  Cơ chế “dọn rác” (garbage collector).  Nguy cơ khi quên hủy tài nguyên đã cấp phát. Thuộc tính đối tượng và phương thức 21
  • 22. 1 2 3 4 5 6 7 Tham số của phương thức VC  BB Tham số giá trị (tham trị) int x int y 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 … 03 00 00 00 06 00 00 00 swap int x int y … int t = x; x = y; y = t; 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 … 03 00 00 00 06 00 00 00 int a = 3 int b = 6 … Thuộc tính đối tượng và phương thức 22
  • 23. 1 2 3 4 5 6 7 Tham số của phương thức VC  BB Tham số con trỏ int* px int* py 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 … 0B 00 00 00 0F 00 00 00 swap … int t = *px; int* px int* py *px = *py; *py = t; 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 … 03 00 00 00 06 00 00 00 int a = 3 int b = 6 … Thuộc tính đối tượng và phương thức 23
  • 24. 1 2 3 4 5 6 7 Tham số của phương thức VC  BB Tham số tham biến (tham chiếu) swap int &x int &y int t = x; x = y; y = t; 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 … 05 00 00 00 06 00 00 00 int a = 3 int b = 6 … Thuộc tính đối tượng và phương thức 24
  • 25. 1 2 3 4 5 6 7 Tham số của phương thức VC  Giá trị mặc định cho các tham số BB Xem lại Chương 1 – Phần 3. Vấn đề về giá trị mặc định của tham số hàm. Ví dụ 1 2 3 4 5 6 7 8 9 10 11 class CFraction { int m_nNum, m_nDenom; public: //  CFraction(), CFraction(int), CFraction(int, int) CPhanSo(int nNum = 0, int nDenom = 1) { if (nDenom == 0) { nDenom = 1; } m_nNum = nNum; m_nDenom = nDenom; } }; Thuộc tính đối tượng và phương thức 25
  • 26. 1 2 3 4 5 6 7 Tham số của phương thức VC  Số lượng tham số không biết trước BB Xem lại Chương 1 – Phần 6. Vấn đề về hàm có số lượng tham số không biết trước. Ví dụ 1 2 3 4 5 6 7 8 9 10 11 class CDynamicArray { int m_nSize; int* m_panData; public: CDynamicArray(int nValue, ...) { // Các thao tác khởi tạo mảng từ dãy các số nguyên // được truyền vào hàm tạo… } }; Thuộc tính đối tượng và phương thức 26
  • 27. 1 2 3 4 5 6 7 Tham số của phương thức VC  BB Đối sánh giữa C++, Java và C# Đọc thêm [OOP] trang 107-110.  Tham trị và tham chiếu. Thuộc tính đối tượng và phương thức 27
  • 28. 1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới VC  BB Nhu cầu và cách thực hiện Xem lại Chương 1 – Phần 7. Nhu cầu về ký hiệu phép toán cho kiểu dữ liệu mới nhưng là các phương thức toán tử thực hiện trên các đối tượng của lớp (class) thay vì là các hàm toán tử thực hiện trên biến có kiểu cấu trúc (struct). Nếu viết toán tử bên trong lớp và toán hạng thứ nhất là đối tượng thuộc lớp đó thì không liệt kê trong danh sách tham số của toán tử. Ngược lại phải liệt kê và sử dụng từ khóa friend để có thể truy cập các thành phần riêng của đối tượng. Thuộc tính đối tượng và phương thức 28
  • 29. 1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới VC  Hàm bạn (friend function) trong C++ BB Khái niệm  Hàm không phải thành viên của lớp nhưng có thể truy cập các thành viên riêng của lớp đó.  Được định nghĩa như một hàm bình thường nhưng bên trong khai báo lớp mà hàm làm bạn sẽ có nguyên mẫu hàm (prototype) bắt đầu bằng từ khóa friend. 1 2 3 4 5 return-type func-name(param-list) { /* … */ } class CFriendTest { friend func-name(param-list); }; Thuộc tính đối tượng và phương thức 29
  • 30. 1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới VC  Hàm bạn (friend) BB Khái niệm  Hàm không phải thành viên của lớp nhưng có thể truy cập các thành viên riêng của lớp đó.  Được định nghĩa như một hàm bình thường nhưng bên trong khai báo lớp mà hàm làm bạn sẽ có nguyên mẫu hàm (prototype) bắt đầu bằng từ khóa friend. 1 2 3 4 5 class CFriendTest { friend func-name(param-list); }; return-type func-name(param-list) { /* … */ } Thuộc tính đối tượng và phương thức 30
  • 31. 1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới VC  BB Hàm bạn (friend) Lưu ý  Hữu ích khi quá tải toán tử hoặc truy cập các thành viên riêng của hai hay nhiều lớp khác nhau (hàm là friend của hơn một lớp).  Hàm friend không phải là thành viên của lớp mà nó làm bạn mà chỉ là hàm thường, do đó: Khi định nghĩa hàm không sử dụng toán tử :: • Không thể gọi hàm bằng cách dùng tên đối tượng và toán tử truy cập thành viên (toán tử . hoặc ->). • Không có con trỏ this trong hàm. • Không thể được kế thừa. • Thuộc tính đối tượng và phương thức 31
  • 32. 1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới VC  Ví dụ BB Toán tử + được viết bên trong lớp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class CFraction { int m_nNum, m_nDenom; public: const CFraction operator+(const CFraction&); }; const CFraction CFraction::operator+(const CFraction& fracR) { CFraction fracResult; fracResult.m_nNum = this->m_nNum * fracR.m_nDenom + fracR.m_nNum * this->m_nDenom; fracResult.m_nDenom = this->m_nDenom * fracR.m_nDenom; return fracResult; } Thuộc tính đối tượng và phương thức 32
  • 33. 1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới VC  Ví dụ BB Toán tử + được viết bên ngoài lớp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class CFraction { int m_nNum, m_nDenom; public: friend const CFraction operator+(const CFraction&, const CFraction&); }; const CFraction operator+(const CFraction& fracL, const CFraction& fracR) { CFraction fracResult; fracResult.m_nNum = fracL.m_nNum * fracR.m_nDenom + fracR.m_nNum * fracL.m_nDenom; fracResult.m_nDenom = fracL.m_nDenom * fracR.m_nDenom; return fracResult; } Thuộc tính đối tượng và phương thức 33
  • 34. 1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới VC  Các toán tử có và không thể nạp chồng BB Danh sách các toán tử có thể nạp chồng cho kiểu dữ liệu mới do người lập trình tự định nghĩa + - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ -- ->* , -> [] () new new[] delete delete[] Danh sách các toán tử không thể nạp chồng cho kiểu dữ liệu mới do người lập trình tự định nghĩa Một số toán tử của C . ?: sizeof Một số toán tử của C++ :: .* typeid Thuộc tính đối tượng và phương thức 34
  • 35. 1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới VC  BB Một số quy ước và lời khuyên Chỉ viết toán tử khi cần thiết (ví dụ làm chương trình dễ xử lý và dễ đọc hơn…) và phù hợp với thực tế (ví dụ toán tử nhân 2 ngày với nhau!) Đảm bảo tính chất của toán tử giống như các tính chất của các kiểu dữ liệu cơ sở (ví dụ toán tử + thực hiện phép… trừ!) Đảm bảo tính nhất quán giữa các cặp toán tử (ví dụ == và !=, ++ và ++(int), > và <, …) Ưu tiên viết bên trong lớp nếu phải truy xuất đến các thành phần thuộc tính của lớp. Ngược lại, ưu tiên viết bên ngoài lớp. Thuộc tính đối tượng và phương thức 35
  • 36. 1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới VC  BB Một số quy ước và lời khuyên Các toán tử 2 ngôi đối xứng thường được viết dưới dạng hàm friend (ví dụ toán tử +, -, …) Các toán tử lvalue phải được viết là phương thức toán tử non-static ở bên trong lớp (ví dụ toán tử =, [], (), ->, *=, ++, …) Sử dụng tham chiếu const cho các đối tượng có kích thước lớn. Sử dụng toán tử () để truy xuất phần tử trong ma trận nhiều chiều. Tận dụng các phương thức tạo lập một tham số phục vụ việc ép kiểu ngầm định. Thuộc tính đối tượng và phương thức 36
  • 37. 1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới VC  BB Một số ví dụ minh họa Toán tử gán  C++ tự động cung cấp toán tử gán mặc định cho lớp đối tượng mới.  Chỉ được gán 2 đối tượng cùng lớp.  Thực hiện theo cơ chế member-wise copy từ đối tượng nguồn sang đối tượng đích theo dạng bit-wise copy, do đó cần phải nạp chồng khi thành phần dữ liệu là các biến con trỏ sử dụng cấp phát bộ nhớ động.  Không dùng hàm friend khi nạp chồng. Thuộc tính đối tượng và phương thức 37
  • 38. 1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới VC  BB Một số ví dụ minh họa Cài đặt toán tử gán cho lớp mảng cấp phát động 1 2 3 4 5 6 7 8 9 10 11 12 13 public: CDynamicArray& operator=(const CDynamicArray& dynArr) { if (this != &dynArr) // Tránh gán chính nó { delete []m_pnData; // Xóa vùng nhớ đang giữ m_nSize = dynArr.m_nSize; m_pnData = new int[m_nSize]; for (int i = 0; i < m_nSize; i++) m_pnData[i] = dynArr.m_pnData[i]; } return *this; } Thuộc tính đối tượng và phương thức 38
  • 39. 1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới VC  Một số ví dụ minh họa BB Toán tử chèn (insertion) << 1 2 3 4 5 6 7 8 9 10 11 12 class CFraction { int m_nNum, m_nDenom; public: friend ostream& operator<<(ostream&, const CFraction&); }; ostream& operator<<(ostream& os, const CFraction& frac) { os << frac.m_nNum << “/” << frac.m_nDenom; return os; } Thuộc tính đối tượng và phương thức 39
  • 40. 1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới VC  Một số ví dụ minh họa BB Toán tử trích (extraction) >> 1 2 3 4 5 6 7 8 9 10 11 12 class CFraction { int m_nNum, m_nDenom; public: friend istream& operator>>(istream&, CFraction&); }; istream& operator>>(istream& is, CFraction& frac) { is >> frac.m_nNum >> frac.m_nDenom; return is; } Thuộc tính đối tượng và phương thức 40
  • 41. 1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới VC  Một số ví dụ minh họa BB Toán tử + viết sai (khác toán tử + gốc) 1 2 3 4 5 6 7 8 9 10 11 12 13 class CFraction { int m_nNum, m_nDenom; public: friend void operator+(CFraction&, const CFraction&); }; void operator+(CFraction& fracL, const CFraction& fracR) { fracL.m_nNum = fracL.m_nNum * fracR.m_nDenom + fracR.m_nNum * fracL.m_nDenom; fracL.m_nDenom = fracL.m_nDenom * fracR.m_nDenom; } Thuộc tính đối tượng và phương thức 41
  • 42. 1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới VC  Một số ví dụ minh họa BB Toán tử ++ sau viết sai (khác toán tử ++ gốc) 1 2 3 4 5 6 7 8 9 10 11 12 class CFraction { int m_nNum, m_nDenom; public: CFraction& operator++(int); // Toán tử ++ sau }; CFraction& CFraction::operator++(int) { m_nNum = m_nNum + m_nDenom; return *this; } Thuộc tính đối tượng và phương thức 42
  • 43. 1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới VC  Một số ví dụ minh họa BB Toán tử ++ sau viết đúng (giống toán tử ++ gốc) 1 2 3 4 5 6 7 8 9 10 11 12 13 class CFraction { int m_nNum, m_nDenom; public: CFraction& operator++(int); // Toán tử ++ sau }; CFraction& CFraction::operator++(int) { CFraction fracResult = *this; m_nNum = m_nNum + m_nDenom; //  ++(*this); return fracResult; } Thuộc tính đối tượng và phương thức 43
  • 44. 1 2 3 4 5 6 7 Định nghĩa phép toán (operators) cho kiểu dữ liệu mới VC  BB Đối sánh giữa C++, Java và C# Đọc thêm [OOP] trang 99-100.  Các quy định nạp chồng toán tử.  Các toán tử có thể nạp chồng. Thuộc tính đối tượng và phương thức 44
  • 45. 1 2 3 4 5 6 7 Phương thức chuyển đổi kiểu dữ liệu (casting methods) VC  BB Khái niệm và phân loại Khái niệm  Ép kiểu (casting) là việc chuyển đổi các biến từ kiểu dữ liệu này sang kiểu dữ liệu khác. Phân loại (trong NNLT C++)  Ép kiểu ngầm định (implicit casting)  Ép kiểu chỉ định (explicit casting) • Ép kiểu theo chuẩn C (C-style casting), ép kiểu tĩnh (static_cast), ép kiểu động (dynamic_cast), ép kiểu hằng (const_cast) và ép kiểu dịch lại (reinterpret_cast)  Phương thức ép kiểu tự định nghĩa • Ép kiểu bằng phương thức tạo lập và ép kiểu bằng toán tử. Thuộc tính đối tượng và phương thức 45
  • 46. 1 2 3 4 5 6 7 Phương thức chuyển đổi kiểu dữ liệu (casting methods) VC  BB Ép kiểu ngầm định Sự tăng cấp (kiểu dữ liệu) trong biểu thức (chỉ chuyển đổi tạm thời, nội bộ)  Các thành phần cùng kiểu thì kết quả là kiểu chung, ví dụ: • • 2 / 4 => 0 (int / int => int) 2.0 / 4.0 => 0.5 (float / float => float)  Các thành phần khác kiểu thì kết quả là kiểu bao quát nhất (char < int < long < float < double), ví dụ: • 2.0 / 4 => 2.0 / 4.0 => 0.5 (float / int => float / float => float) Thuộc tính đối tượng và phương thức 46
  • 47. 1 2 3 4 5 6 7 Phương thức chuyển đổi kiểu dữ liệu (casting methods) VC  BB Ép kiểu ngầm định Trong phép gán, biểu thức ở vế phải luôn được tăng cấp (hay giảm cấp) tạm thời cho giống biểu thức ở vế trái và có thể làm mất tính chính xác của số nguyên khi chuyển sang số thực! 1 2 3 4 5 6 int i, j = 3; float f = 1.23; i = f; //  f tạm thời giảm cấp thành int f = i; //  i tạm thời nâng cấp thành float f = j; //  j tạm thời nâng cấp thành float, f = 2.999995 Thuộc tính đối tượng và phương thức 47
  • 48. 1 2 3 4 5 6 7 Phương thức chuyển đổi kiểu dữ liệu (casting methods) VC  BB Ép kiểu chỉ định Xem chi tiết trong [OOP] trang 110-119.  Ép kiểu theo chuẩn C (C-style casting).  Ep kiểu tĩnh (static_cast).  Ép kiểu động (dynamic_cast).  Ép kiểu hằng (const_cast).  Ép kiểu dịch lại (reinterpret_cast). Thuộc tính đối tượng và phương thức 48
  • 49. 1 2 3 4 5 6 7 Phương thức chuyển đổi kiểu dữ liệu (casting methods) VC  Phương thức ép kiểu tự định nghĩa BB Ép kiểu bằng phương thức tạo lập (1 tham số) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class CFraction { int m_nNum, m_nDenom; public: CFraction() { m_nNum = 0; m_nDenom = 1; } CFraction(int nNum) { m_nNum = nNum; m_nDenom = 1; } // Các phương thức khác… }; void main() { CFraction frac1 = 2912; //  CFraction(2912) CFraction frac2; //  CFraction() frac2 = 1706; //  CFraction(1706), operator= } Thuộc tính đối tượng và phương thức 49
  • 50. 1 2 3 4 5 6 7 Phương thức chuyển đổi kiểu dữ liệu (casting methods) VC  Phương thức ép kiểu tự định nghĩa BB Ép kiểu dữ liệu bằng toán tử 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class CFraction { int m_nNum, m_nDenom; public: CFraction(int nNum, int nDenom) { m_nNum = nNum; m_nDenom = nDenom; } operator int() const { return m_nNum / m_nDenom; } }; void main() { CFraction frac(2912, 1706); int nResult1 = frac; // Ép kiểu ngầm định int nResult2 = int(frac); // Ép kiểu chỉ định int nResult3 = (int)frac; // Ép kiểu chỉ định } Thuộc tính đối tượng và phương thức 50
  • 51. 1 2 3 4 5 6 7 Một số vấn đề liên quan khác VC  BB Thành phần tĩnh (static) Khái niệm  Thành phần dữ liệu tĩnh (static data member hay class-level member) và phương thức tĩnh (static method hay class-level method) của lớp không phụ thuộc vào một đối tượng cụ thể nào cả mà là thành phần chung cho tất cả các đối tượng của lớp tương ứng. Cú pháp 1 2 static type-name var-name; static return-type method-name(param-list); Thuộc tính đối tượng và phương thức 51
  • 52. 1 2 3 4 5 6 7 Một số vấn đề liên quan khác VC  Thành phần tĩnh (static) BB Ví dụ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class CStaticTest { static int s_nCount; // Số lượng đối tượng public: static int getCount() { return s_nCount; } CStaticTest() { ++s_nCount; } ~CStaticTest() { --s_nCount; } }; int CStaticTest::s_nCount = 0; // Bỏ từ khóa static void main() { CStaticTest staticTest1, staticTest2; cout << “Number of objects: ” << CStaticTest::getCount(); } Thuộc tính đối tượng và phương thức 52
  • 53. 1 2 3 4 5 6 7 Một số vấn đề liên quan khác VC  BB Thành phần dữ liệu có kiểu là lớp Khi A có thành phần dữ liệu là một đối tượng có kiểu thuộc lớp B thì:  Khi A được tạo lập  Phương thức tạo lập của lớp B được thực hiện trước.  Khi A bị hủy  Phương thức hủy của lớp B được thực hiện sau. Ký hiệu UML (quan hệ association) A B - b: B Thuộc tính đối tượng và phương thức 53
  • 54. 1 2 3 4 5 6 7 Một số vấn đề liên quan khác VC  Thành phần dữ liệu có kiểu là lớp BB Ví dụ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class CB { public: CB() { cout << “Constructing CB...” << endl; } ~CB() { cout << “Destructing CB...” << endl; } }; class CA { CB m_b; public: CA() { cout << “Constructing CA...” << endl; } ~CA() { cout << “Destructing CA...” << endl; } }; void main() { CA a; } Thuộc tính đối tượng và phương thức 54
  • 55. 1 2 3 4 5 6 7 Một số vấn đề liên quan khác VC  BB Danh sách khởi tạo (initializers) Khái niệm  Khởi tạo giá trị cho các thành phần dữ liệu của lớp (thứ tự thực hiện trong khai báo lớp).  Là cách duy nhất được sử dụng trong các trường hợp không thể tạo lập giá trị ban đầu cho các thành phần dữ liệu có kiểu hằng số, tham chiếu hay đối tượng của lớp không có phương thức tạo lập mặc định. Cú pháp 1 class-name(param-list) : var-name-1(arg), var-name-2(arg) Thuộc tính đối tượng và phương thức 55
  • 56. 1 2 3 4 5 6 7 Một số vấn đề liên quan khác VC  Danh sách khởi tạo (initializers) BB Ví dụ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class CA { int m_nX; public: CA(int nX) { m_nX = nX; } }; class CTest { const int m_nK; CA& m_aRef; CA m_a; public: CTest(int nK, A& aRef) : m_nK(nK), m_aRef(aRef), m_a(nK) { }; }; Thuộc tính đối tượng và phương thức 56
  • 57. 1 2 3 4 5 6 7 Một số vấn đề liên quan khác VC  BB Phương thức có thuộc tính const Khái niệm  Cam kết sẽ không làm thay đổi trạng thái hay giá trị của các thành phần dữ liệu của lớp.  Đối tượng bình thường có thể gọi được phương thức bình thường hoặc const.  Đối tượng const có thể gọi phương thức const nhưng không thể gọi phương thức bình thường. Cú pháp 1 return-type method-name(param-list) const; Thuộc tính đối tượng và phương thức 57
  • 58. 1 2 3 4 5 6 7 Một số vấn đề liên quan khác VC  Phương thức có thuộc tính const BB Ví dụ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class CA { public: void test() { } void testConst() const { } }; void doSomething(CA a1, const CA& a2) { a1.test(); // OK, a1 non-const a1.testConst(); // OK, a1 non-const a2.test(); // Lỗi, a2 const, test() non-const a2.testConst(); // OK, testConst() const } Thuộc tính đối tượng và phương thức 58
  • 59. 1 2 3 4 5 6 7 Một số vấn đề liên quan khác VC  BB Luật bộ ba (rule of three) Luật bộ ba (“rule of three”, “the Law of The Big Three” hay “The Big Three”), được Marshall Cline đề xuất năm 1991, là quy tắc trong C++ nói rằng “nếu một lớp đối tượng định nghĩa lại một trong ba phương thức gồm phương thức hủy – tạo lập sao chép – toán tử gán thì lớp đối tượng này nên định nghĩa luôn cả ba phương thức đó một cách tường minh”. Thường được áp dụng trong các lớp đối tượng có thuộc tính thành viên là con trỏ sử dụng bộ nhớ được cấp phát động. Thuộc tính đối tượng và phương thức 59
  • 60. 1 2 3 4 5 6 7 Áp dụng VC  BB Mẫu thiết kế Singleton và áp dụng Mẫu thiết kế (design pattern)  Là lời giải mẫu cho các bài toán giống nhau.  Cuốn sách nổi tiếng “Design Patterns – Elements of Reusable Object-Oriented Software (năm 1994) • • Nhóm 4 tác giả (Gang of Four – GoF) bao gồm Erich Gamma, Richard Helm, Ralph Johnson và John Vlissides. Gồm 23 mẫu thiết kế (được gọi là mẫu GoF). Thuộc tính đối tượng và phương thức 60
  • 61. 1 2 3 4 5 6 7 Áp dụng VC  BB Mẫu thiết kế Singleton và áp dụng Khái niệm  Là mẫu thiết kế trong lập trình hướng.  Áp dụng mẫu này lên một lớp sẽ đảm bảo lớp này chỉ có nhiều nhất một đối tượng được tạo ra trong suốt chương trình. Sơ đồ UML CSingelton - static CSingleton s_pInstance CSingleton getInstance() { return s_pInstance; - CSingleton() + getInstance(): CSingleton } Thuộc tính đối tượng và phương thức 61
  • 62. 1 2 3 4 5 6 7 Áp dụng VC  BB Mẫu thiết kế Singleton và áp dụng Ý tưởng cài đặt (các vấn đề cần giải quyết)  Đặt các phương thức tạo lập dạng private để người dùng không thể tự ý tạo đối tượng mới (phải định nghĩa phương thức tạo lập để tránh sử dụng phương thức tạo lập mặc định)  Tạo sẵn một đối tượng CSingleton duy nhất (nếu có) ở dạng static để người dùng chỉ được phép sử dụng đối tượng đã có sẵn này (lấy đối tượng thông qua một phương thức static mà ta cung cấp). Thuộc tính đối tượng và phương thức 62
  • 63. 1 2 3 4 5 6 7 Áp dụng VC  Mẫu thiết kế Singleton và áp dụng BB Cài đặt (nên chia mã nguồn thành nhiều tập tin) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class CSingleton { static CSingleton* s_pInstance; // Đối tượng duy nhất CSingleton() { } // Phương thức tạo lập public: static CSingleton* getInstance(); }; CSingleton* CSingleton::s_pInstance = NULL; static CSingleton* getInstance() // Phương thức lấy { // đối tượng của lớp if (s_pInstance == NULL) s_pInstance = new CSingleton(); return s_pInstance; } void main() { CSingleton* pObj = CSingleton::getInstance(); } Thuộc tính đối tượng và phương thức 63
  • 64. 1 2 3 4 5 6 7 Áp dụng VC  BB Mẫu thiết kế Singleton và áp dụng Thảo luận về các ứng dụng trong thực tế và biến thể “Multi”-ton của mẫu Singleton. Thuộc tính đối tượng và phương thức 64
  • 65. 1 2 3 4 5 6 7 VC  BB Một số thuật ngữ bitwise copy: tương tự như member-wise copy. casting: ép kiểu. const casting: ép kiểu hằng constructor: phương thức tạo lập. C-style casting: ép kiểu theo chuẩn C. deep copy: khác với shallow copy, sao chép đầy đủ các thành phần (kể cả sao chép các vùng nhớ mà các thành phần con trỏ đang trỏ tới). default constructor: phương thức tạo lập mặc định. design pattern: mẫu thiết kế. destructor: phương thức hủy. dynamic casting: é kiểu động. explicit casting: ép kiểu chỉ định. Thuộc tính đối tượng và phương thức 65
  • 66. 1 2 3 4 5 6 7 VC  BB Một số thuật ngữ formal argument: tham số hình thức (gọi tắt là tham số). implicit casting: ép kiểu ngầm định. initializers: danh sách khởi tạo cho phương thức tạo lập. member-wise copy: sao chép các thành viên. operator: toán tử. reinterpret casting: ép kiểu dịch lại. shallow copy: tương tự như member-wise copy. static casting: ép kiểu tĩnh. static constructor: phương thức tạo lập tĩnh. static member, class-level member: thành phần tinh của lớp, chung cho mọi đối tượng của lớp. static method, class-level method: phương thức tĩnh của lớp, phương thức chung cho mọi đối tượng của lớp. virtual method: phương thức ảo. Thuộc tính đối tượng và phương thức 66
  • 67. 1 2 3 4 5 6 7 VC  BB Tài liệu tham khảo [OOP] Chương 3 – Thuộc tính đối tượng và phương thức (trang 76-134) [Primer] Chapter 10 – Objects and Classes Class Constructors and Destructors (trang 463-476) Knowing Your Objects: The this Pointer (trang 477-482) [Primer] Chapter 11 – Working with Classes Operator Overloading & Introducing Friends(trang 502-541) Automatic Conversions and Type Casts for Classes (trang 541-556) [Primer] Chapter 15 – Friends, Exceptions, and More Type Cast Operators (trang 848-852) Thuộc tính đối tượng và phương thức 67
  • 68. 1 2 3 4 5 6 7 VC  BB Bài tập Bài tập 4.1: Cài đặt lớp đồng hồ bấm giờ để xác định thời gian (số giây) trôi qua (CStopWatch) hỗ trợ một số hành động như sau:  Tự động thiết lập thời gian ban đầu bằng 0.  Bắt đầu (start), dừng hẳn (stop), tạm dừng (pause), tiếp tục (resume) tính thời gian trôi qua.  Hiển thị (show) thời gian đã trôi qua ở lần gần nhất (tự động gọi mỗi khi pause và stop).  Tự động hiển thị thời gian đã trôi qua từ khi bắt đầu sinh ra đến khi khi đối tượng bị hủy. Thuộc tính đối tượng và phương thức 68
  • 69. 1 2 3 4 5 6 7 VC  BB Bài tập Bài tập 4.2 đến 4.6: Bổ sung các phương thức tạo lập, phương thức hủy thích hợp và nạp chồng các toán tử cơ bản cho các bài tập:  2.6: Lớp phân số (CFraction).  2.7: Lớp đơn thức (CMonomial).  2.10: Lớp ngày (CDate).  3.1: Lớp học sinh (CStudent) sử dụng lớp string.  3.2: Lớp mảng (CDynamicArray) sử dụng lớp vector. Thuộc tính đối tượng và phương thức 69
  • 70. 1 2 3 4 5 6 7 VC  BB Bài tập Bài tập 4.7: Xây dựng lớp số phức (CComplex) hỗ trợ một số phương thức cơ bản (bao gồm các phương thức tạo lập và phương thức hủy) và nạp chồng các toán tử cơ bản. Bài tập 4.8: Cài đặt lớp các thuật toán sắp xếp tăng dần các số thực (CSingleSortAlgorithm) chỉ cho phép thực hiện một phương pháp sắp xếp đã chọn cho toàn bộ chương trình. Bài tập 4.9: Cài đặt lớp cung cấp các thuật toán sắp xếp tăng dần không cần tạo ra đối tượng khi sử dụng (CStaticSortAlgorithm). Thuộc tính đối tượng và phương thức 70