SlideShare a Scribd company logo
1 of 32
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 1
LỚPLỚP
Bộ môn Hệ Thống Máy Tính và Truyền Thông
Khoa Công Nghệ Thông Tin và Truyền Thông
Đại học Cần Thơ
CHƯƠNG 7:CHƯƠNG 7:
(CLASS)(CLASS)
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 2
Nội dungNội dung
 Lớp – Quyền truy xuất
 Khai báo, định nghĩa 1 lớp đơn giản
 Hàm thành viên nội tuyến (inline)
 Hàm xây dựng (constructor)
 Hàm hủy (destructor)
 Hàm bạn (friend) – Lớp bạn
 Đối số mặc định
 Đối số thành viên ẩn (con trỏ this)
Chương 7
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 3
Nội dung (tt)Nội dung (tt)
 Toán tử phạm vi
 Danh sách khởi tạo thành viên
 Thành viên hằng - Thành viên tĩnh
 Thành viên tham chiếu
 Thành viên là đối tượng của 1 lớp
 Mảng các đối tượng
 Phạm vi lớp
 Cấu trúc (structure) và hợp (union)
 Các trường bit
Chương 7
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 4
Khái niệm lớpKhái niệm lớp
Chương 7
 Lớp: kiểu dữ liệu trừu tượng.
TÊN LỚPTÊN LỚP
Dữ liệu
thành viên
Hàm
thành viên
Đặc tả
đối
tượng
Tập các
thao tác
class TÊNLỚPTÊNLỚP
[: <Quyền truy xuất> LỚPCHALỚPCHA ]
{ <Quyền truy xuất > :
DataType1 memberdata1;
DataType2 memberdata2;
…………….
< Quyền truy xuất > :
memberFunction1();
memberFunction2();
…………..
};
private
protected
public
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 5
Lớp đơn giảnLớp đơn giản
 Ví dụ:
Chương 7
class PointPoint {
int xVal, yVal;
public:
void SetPt (int, int);
void OffsetPt (int, int);
};
void PointPoint::SetPt (int x, int y) {
xVal = x;
yVal = y;
}
void PointPoint::OffsetPt (int x, int y) {
xVal += x;
yVal += y;
}
void main() {
Point pt;
pt.SetPt(10,20);
pt.OffsetPt(2,2);
……..
pt.xVal = 10; // Đúng hay sai?
Point pt1, pt2, pt3;
……….
}
Gọi hàm
trên
đối tượng
Tạo ra
đối tượng
thuộc lớp
Point
Khai báo
Lớp
Định nghĩa
các hàm
thành viên
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 6
Hàm thành viên nội tuyếnHàm thành viên nội tuyến
 Hàm inlineinline:
 Cải thiện tốc độ thực thi
 Tốn bộ nhớ (dành cho mã lệnh) khi thực thi.
Chương 7
class PointPoint {
int xVal, yVal;
public:
void SetPt (int, int);
void OffsetPt (int, int);
};
inline void PointPoint::SetPt (int x, int y) {
xVal = x;
yVal = y;
}
……………
class PointPoint {
int xVal, yVal;
public:
void SetPt (int x, int y) {
xVal = x;
yVal = y;
}
void OffsetPt (int x, int y) {
xVal += x;
yVal += y;
}
};
Cách 2Cách 2:
Định
nghĩa
bên
trong
lớp
Cách 1Cách 1:
thêm
Từ
khóa
inline
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 7
Ví dụ - Lớp Set (tập hợp)Ví dụ - Lớp Set (tập hợp)
Chương 7
#include <iostream.h>
const maxCard = 100;
enum Bool {false, true};
class SetSet {
private:
int elems[maxCard];
int card;
public:
void EmptySet(){ card = 0; }
Bool IsMember (const int);
void AddElem (const int);
void RmvElem (const int);
void Copy (Set&);
Bool Equal (Set&);
void Intersect (Set&, Set&);
void Union (Set&, Set&);
void Print ();
};
Bool Set::IsMember (const int elem) {
for (register i = 0; i < card; ++i)
if (elems[i] == elem)
return true;
return false;
}
void Set::AddElem (const int elem) {
if (IsMember(elem))
return;
if (card < maxCard)
elems[card++] = elem;
else
cout << "Set overflow“<<endl;
}
void Set::RmvElem (const int elem) {
for (register i = 0; i < card; ++i)
if (elems[i] == elem) {
for (; i < card-1; ++i) // Dịch
elems[i] = elems[i+1];
--card;
}
}
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 8
Ví dụ - Lớp Set (tt)Ví dụ - Lớp Set (tt)
Chương 7
void Set::Copy (Set &set) {
for (register i = 0; i < card; ++i)
set.elems[i] = elems[i];
set.card = card;
}
Bool Set::Equal (Set &set) {
if (card != set.card)
return false;
for (register i = 0; i < card; ++i)
if (!set.IsMember(elems[i]))
return false;
return true;
}
void Set::Print (void) {
cout << "{";
for (int i = 0; i < card-1; ++i)
cout << elems[i] << ",";
if (card > 0)
cout << elems[card-1];
cout << "}“<<endl;
}
………
int main (void) {
Set s1, s2;
s1.EmptySet(); s2.EmptySet();
s1.AddElem(10); s1.AddElem(20);
s1.AddElem(30); s1.AddElem(40);
s2.AddElem(30); s2.AddElem(50);
s2.AddElem(10); s2.AddElem(60);
cout << "s1 = "; s1.Print();
cout << "s2 = "; s2.Print();
s2.RmvElem(50);
cout << "s2 - {50} = ";
s2.Print();
if (s1.IsMember(20))
cout << "20 is in s1n";
if (!s1.Equal(s2))
cout << "s1 <> s2n";
return 0;
}
KếtKết
quả ?quả ?
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 9
Hàm xây dựngHàm xây dựng
Chương 7
 Dùng để định nghĩađịnh nghĩa và khởi tạokhởi tạo đối tượng cùng 1 lúc.
 Có tên trùng với tên lớp, không có kiểu trả về.
 Không gọi trực tiếp, sẽ được tự động gọi khi khởi tạo đt.
 Gán giá trị, cấp vùng nhớGán giá trị, cấp vùng nhớ cho các dữ liệu thành viêndữ liệu thành viên.
class PointPoint {
int xVal, yVal;
public:
Point (int x, int y) {
xVal = x; yVal = y;
}
void OffsetPt (int x, int y) {
xVal += x; yVal += y;
}
};
void main() {
Point pt1(10,20);
pt1.OffsetPt(2,2);
……..
// Khai báo nào là sai ?
Point pt2;
Point pt3();
Point pt4 = Point(5,5);
Point pt5 = new Point(5,5);
……….
}
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 10
Hàm xây dựng (tt)Hàm xây dựng (tt)
Chương 7
class PointPoint {
int xVal, yVal;
public:
Point () // Hàm xây dựng mặc nhiên
{ xVal = 0; yVal = 0; }
Point (int x, int y) {
xVal = x; yVal = y;
}
Point (float len, float angle) {
xVal = (int) (len * cos(angle));
yVal = (int) (len * sin(angle));
}
void OffsetPt (int , int ); …
};
void main() {
Point p1;
Point p2(10,20);
Point p3(60.3, 3.14);
}
class SetSet {
private:
int *elems;
int maxCard;
int card;
public:
Set(const int size) {
elems = new int[size];
maxCard = size;
card = 0;
}
……………
};
void main() {
Set s1(100);
Set s2(20);
Set s3(1000); …
}
Mềm
dẻo
hơn
Không cần
phải nhớ
gọi hàm
EmptySet()EmptySet()
khi khởi tạo
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 11
Hàm hủyHàm hủy
Chương 7
 Dọn dẹp 1 đối tượng trước khitrước khi nó được thu hồi.
 Cú pháp: ~TenLop() { ……... }
 Không gọi trực tiếp, sẽ được tự động gọi khi hủy bỏ đt.
 Thu hồi vùng nhớThu hồi vùng nhớ cho các dữ liệu thành viêndữ liệu thành viên là con trỏcon trỏ.
class SetSet {
private:
int *elems;
int maxCard;
int card;
public:
Set(const int size) { …… }
~Set() { delete[] elems; }
….
};
Set TestFunct1(Set s1) {
Set *s = new Set(50);
return *s;
}
void main() {
Set s1(40), s2(50);
s2 = TestFunct1(s1);
}
Tổng cộng
có baobao
nhiêu lầnnhiêu lần
hàm hủy
được gọi ?
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 12
Bạn (Friend) – Đặt vấn đềBạn (Friend) – Đặt vấn đề
class IntSetIntSet {
public:
//...
private:
int elems[maxCard];
int card;
};
class RealSetRealSet {
public:
//...
private:
float elems[maxCard];
int card;
};
Tập Các
Số Nguyên
Tập Các
Số Thực
void IntSet::SetToReal (RealSet &set) {
set.card = card;
for (register i = 0; i < card; ++i)
set.elems[i] = (float) elems[i];
}
Hàm SetToReal
dùng để chuyển
tập số nguyên
thành tập số thực
Làm thế nào
để thực hiện
được việc truy
xuất
đến thành viên
PrivatePrivate ?
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 13
Hàm bạn (Friend)Hàm bạn (Friend)
 Cách 1: Khai báo hàm thành viên của lớp
IntSet là bạnbạn (friendfriend) của lớp RealSet.
class IntSetIntSet {
public:
//...
private:
int elems[maxCard];
int card;
};
class RealSetRealSet {
public:
//...
friend void IntSet::SetToRealSetToReal (RealSet&);
private:
float elems[maxCard];
int card;
};
Giữ nguyên định
nghĩa của lớp IntSet
Thêm dòng khai báo
Friend cho
hàm thành viên
SetToReal
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 14
Hàm bạn (Friend)Hàm bạn (Friend)
 Cách 2:
 Chuyển hàm SetToReal ra ngoài (độc lậpđộc lập).
 Khai báo hàm đó là bạnbạn của cả 2 lớp.
class IntSetIntSet {
public:
//...
friend void SetToReal (IntSet &, RealSet&);
private:
int elems[maxCard];
int card;
};
class RealSetRealSet {
public:
//...
friend void SetToReal (IntSet &, RealSet&);
private:
float elems[maxCard];
int card;
};
void SetToRealSetToReal (IntSet& iSet,
RealSet& rSet )
{
rSet.card = iSet.card;
for (int i = 0; i < iSet.card; ++i)
rSet.elems[i] =
(float) iSet.elems[i];
}
Hàm độc lập
là bạn(friend)
của cả 2 lớp.
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 15
Bạn (Friend)Bạn (Friend)
 Hàm bạnHàm bạn:
 Có quyền truy xuất đến tất cả các dữ liệudữ liệu và
hàmhàm thành viên (protected + private) của 1 lớp.
 Lý do:
 Cách định nghĩa hàm chính xác.
 Hàm cài đặt không hiệu quả.
 Lớp bạnLớp bạn:
 Tất cả các hàm trong lớp bạn: là hàm bạn.
class A;
class B { // ……….
friend class A;
};
class IntSetIntSet { ……….. }
class RealSetRealSet { // ……….
friend class IntSet;
};
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 16
Đối số mặc địnhĐối số mặc định
 Đối số mặc định tính từ bên phải.
class PointPoint {
int xVal, yVal;
public:
Point (int x = 0, int y = 0);
//...
};
void main() {
Point p1; // như là ???
Point p2(10); // như là ???
Point p3(10,20);
Point p4(, 20); // ?????
…..
}
class PointPoint {
int xVal, yVal;
public:
Point (int x = 0, int y = 0);
Point (float x=0, float y=0);
//...
};
void main() {
Point p2(1.6, 5.0); // như là ???
Point p3(10,20); // như là ???
Point p4; // ?????
…..
}
Tối nghĩa
Mơ hồ
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 17
Đối số thành viên ẩnĐối số thành viên ẩn
 Con trỏ *thisCon trỏ *this:
 Là 1 thành viên ẩn, có thuộc tính là private.
 Trỏ tới chính bản thân đối tượng.
void PointPoint::OffsetPt (int x, int y) {
xVal += x;
yVal += y;
}
void PointPoint::OffsetPt (int x, int y) {
this->xVal += x;
this->yVal += y;
}
• Có những trường hợp sử dụng *this là dư thừa (Ví dụ trên)
• Tuy nhiên, có những trường hợp phải sử dụng con trỏ *this*this
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 18
Toán tử phạm viToán tử phạm vi
 Toán tử :::: dùng để xác định chính xác hàm
(thuộc tính) được truy xuất thuộc lớp nào.
 Câu lệnh: pt.OffsetPt(2,2);
<=> pt.Point::OffsetPt(2,2);
 Cần thiết trong một số trường hợp:
 Cách gọi hàm trong thừa kế.
 Tên thành viên bị che bởi biến cục bộ.
Ví dụ: Point(int xVal, int yVal) {
Point::xVal = xVal;
Point::yVal = yVal;
}
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 19
Danh sách khởi tạo thành viênDanh sách khởi tạo thành viên
 Tương đương việc gán giá trị dữ liệu thành viên.
class ImageImage {
public:
Image(const int w, const int h);
private:
int width;
int height;
//...
};
Image::Image(const int w, const int h) {
width = w;
height = h;
//.....................
}
Image::Image (const int w, const int h)
: width(w), height(h)
{ //............... }
class PointPoint {
int xVal, yVal;
public:
Point (int x, int y) {
xVal = x;
yVal = y;
}
// ……………………
};
Point::Point (int x, int y)
: xVal(x), yVal(y)
{ }
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 20
Thành viên hằngThành viên hằng
 Hằng dữ liệu thành viên:
class ImageImage {
public:
Image(const int w, const int h);
private:
const intconst int width;
const intconst int height;
//...
};
Image::Image (const int w, const int h)
: width(w), height(h)
{ //................ }
Khai báo bình thường
như dữ liệu thành viên
class ImageImage {
const int width = 256;
const int height = 168;
//...
};
Khởi tạo
SAI
Khởi tạo ĐÚNG
thông qua danh sách
khởi tạo thành viên
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 21
Thành viên hằngThành viên hằng
 Hằng đối tượng: không được thay đổi giá trị.
 Hàm thành viên hằng:
 Được phép gọi trên hằng đối tượng.
 Không được thay đổi giá trị dữ liệu thành viên.
class SetSet {
public:
Set(void){ card = 0; }
Bool Member(const int) const;
void AddElem(const int);
//...
};
Bool Set::Member (const int elem) const
{ //...
}
void main() {
const Set s;
s.AddElem(10); // SAI
s.Member(10); // ok
}
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 22
Thành viên tĩnhThành viên tĩnh
 Dữ liệu thành viên tĩnh:
 Dùng chung 1 bản sao chép (1 vùng nhớ) chia sẻ
cho tất cả đối tượng của lớp đó.
 Sử dụng: <TênLớp>::<TênDữLiệuThànhViên>
 Thường dùng để đếm số lượng đối tượng.
class WindowWindow {
// danh sách liên kết tất cả Window
static Window *first;
// con trỏ tới window kế tiếp
Window *next;
//...
};
Window *Window::Window::first = &myWindow;
// …………….
Khởi tạo
dữ liệu
thành viên
tĩnh
Khai báo
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 23
Thành viên tĩnhThành viên tĩnh
 Hàm thành viên tĩnh:
 Tương đương với hàm toàn cục.
 Gọi thông qua: <TênLớp>::<TênHàm>
class WindowWindow {
// ……….
static void PaintProc () { ….. }
// ………
};
void main() {
// …………….
Window::Window::PainProc();
}
Truy xuất
hàm thành
viên tĩnh
Khai báo
Định nghĩa
hàm thành
viên tĩnh
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 24
class Image {
int width;
int height;
int &widthRef = width;
//...
};
Thành viên tham chiếuThành viên tham chiếu
 Tham chiếu dữ liệu thành viên:
class Image {
int width;
int height;
int &widthRef;
//...
};
Image::Image (const int w, const int h)
: widthRef(width)
{ //……………... }
Khai báo bình thường
như dữ liệu thành viên
Khởi tạo
SAI
Khởi tạo ĐÚNG
thông qua danh sách
khởi tạo thành viên
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 25
Thành viên là đối tượng của 1 lớpThành viên là đối tượng của 1 lớp
 Dữ liệu thành viên có thể có kiểu:
 Dữ liệu (lớp) chuẩn của ngôn ngữ.
 Lớp do người dùng định nghĩa (có thể là chính lớp đó).
class Point { ……. };
class RectangleRectangle {
public:
Rectangle (int left, int top, int right, int bottom);
//...
private:
Point topLeft;
Point botRight;
};
Rectangle::Rectangle (int left, int top, int right, int bottom)
: topLeft(left,top), botRight(right,bottom)
{ }
Khởi tạo cho các
dữ liệu thành viên
qua danh sách khởi
tạo thành viên
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 26
Mảng các đối tượngMảng các đối tượng
 Sử dụng hàm xây dựng không đối số (hàm
xây dựng mặc nhiên - default constructor).
VD: Point pentagon[5];
 Sử dụng bộ khởi tạo mảng:
VD: Point triangle[3] =
{ Point(4,8), Point(10,20), Point(35,15) };
Ngắn gọn:
Set s[4] = { 10, 20, 30, 40 };
tương đương với:
Set s[4] = { Set(10), Set(20), Set(30), Set(40) };
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 27
Mảng các đối tượngMảng các đối tượng
 Sử dụng dạng con trỏ:
 Cấp vùng nhớ:
VD: Point *pentagon = new Point[5];
 Thu hồi vùng nhớ:
delete[] pentagon;
delete pentagon; // Thu hồi vùng nhớ đầu
class PolygonPolygon {
public:
//...
private:
Point *vertices; // các đỉnh
int nVertices; // số các đỉnh
};
Không cần biết kích
thước mảng.
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 28
Phạm vi lớpPhạm vi lớp
 Thành viên trong 1 lớp:
 Che các thực thể trùng tên trong phạm vi.
// ………
int fork (void); // fork hệ thống
class ProcessProcess {
int fork (void); // fork thành viên
//...
};
// ………
int Process::func1 (void)
{ int x = fork(); // gọi fork cục bộ
int pid = ::fork(); // gọi hàm fork hệ thống
//...
}
fork thành viên
che đi fork toàn cục
trong phạm vi lớp
Process
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 29
Phạm vi lớpPhạm vi lớp
 Lớp toàn cục: đại đa số lớp trong C++.
 Lớp lồng nhau: lớp chứa đựng lớp.
 Lớp cục bộ: trong 1 hàm hoặc 1 khối.
class RectangleRectangle { // Lớp lồng nhau
public:
Rectangle (int, int, int, int);
//..
private:
class Point {
public:
Point(int a, int b) { … }
private:
int x, y;
};
Point topLeft, botRight;
};
Rectangle::Point pt(1,1); // sd ở ngoài
void Render (Image &i)
{
class ColorTableColorTable {
public:
ColorTable () { /* ... */ }
AddEntry (int r, int g, int b)
{ /* ... */ }
//...
};
ColorTable colors;
//...
}
ColorTable ct; // SAI
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 30
Cấu trúc và hợpCấu trúc và hợp
 Cấu trúc (structure):
 Bắt nguồn từ ngôn ngữ C.
 Tương đương với class với các thuộc tính là public.
 Sử dụng như class.
struct PointPoint {
Point (int, int);
void OffsetPt(int, int);
int x, y;
};
class PointPoint {
public:
Point(int, int);
void OffsetPt(int, int);
int x, y;
};
Point p = { 10, 20 }; Có thể khởi tạo dạng này
nếu không có định nghĩa
hàm xây dựng
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 31
Cấu trúc và hợpCấu trúc và hợp
 Hợp (union):
 Tất cả thành viên ánh xạ đến cùng 1 địa chỉ bên
trong đối tượng chính nó (không liên tiếp).
 Kích thước = kích thước của dữ liệu lớn nhất.
union ValueValue {
long integer;
double real;
char *string;
Pair list;
//...
};
Kích thước của Value là
8 bytes = sizeof(double)
class PairPair {
Value *head;
Value *tail;
//...
};
class ObjectObject {
private:
enum ObjType {intObj, realObj,
strObj, listObj};
ObjType type; // kiểu đối tượng
Value val; // giá trị của đối tượng
//...
};
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 32
Các trường bitCác trường bit
 Điều khiển đối tượng ở mức bit.
VD: Truy xuất các bit trong header của gói tin.
typedef unsigned int BitBit;
class PacketPacket {
Bit type : 2; // rộng 2 bit
Bit acknowledge : 1; // rộng 1 bit
Bit channel : 4; // rộng 4 bit
Bit sequenceNo : 4; // rộng 4 bit
Bit moreData : 1; // rộng 1 bit
//...
};
enum PacketType { dataPack, controlPack,
supervisoryPack };
enum Bool { false, true };
// …………
PacketPacket p;
p.type = controlPack;
p.acknowledge = true;

More Related Content

What's hot

Hướng dẫn lập trình CMS Joomla 2.5
Hướng dẫn lập trình CMS Joomla 2.5 Hướng dẫn lập trình CMS Joomla 2.5
Hướng dẫn lập trình CMS Joomla 2.5 ZendVN
 
Bai09 ngoai levaxulyngoaile
Bai09 ngoai levaxulyngoaileBai09 ngoai levaxulyngoaile
Bai09 ngoai levaxulyngoaileNhuận Lê Văn
 
giao trinh c++ Chuong1
giao trinh c++ Chuong1giao trinh c++ Chuong1
giao trinh c++ Chuong1Bễ Nguyễn
 
Bài tập nhập môn lập trình
Bài tập nhập môn lập trìnhBài tập nhập môn lập trình
Bài tập nhập môn lập trìnhHuy Rùa
 
3 Function
3 Function3 Function
3 FunctionCuong
 
Tin học ứng dụng trong kinh doanh data4u
Tin học ứng dụng trong kinh doanh data4uTin học ứng dụng trong kinh doanh data4u
Tin học ứng dụng trong kinh doanh data4uXephang Daihoc
 
Tai lieu huong_dan_hoc_matlab_danh_cho_mon_xu_ly_anh_rat_hay_2264_7433
Tai lieu huong_dan_hoc_matlab_danh_cho_mon_xu_ly_anh_rat_hay_2264_7433Tai lieu huong_dan_hoc_matlab_danh_cho_mon_xu_ly_anh_rat_hay_2264_7433
Tai lieu huong_dan_hoc_matlab_danh_cho_mon_xu_ly_anh_rat_hay_2264_7433Muoivy Wm
 
B%c3%a1o%20c%c3%a1o%20gi%e1%ba%a3i%20t%c3%a dch%202
B%c3%a1o%20c%c3%a1o%20gi%e1%ba%a3i%20t%c3%a dch%202B%c3%a1o%20c%c3%a1o%20gi%e1%ba%a3i%20t%c3%a dch%202
B%c3%a1o%20c%c3%a1o%20gi%e1%ba%a3i%20t%c3%a dch%202Tran Anh
 
Ngon ngu c theo chuan ansi
Ngon ngu c theo chuan ansiNgon ngu c theo chuan ansi
Ngon ngu c theo chuan ansiHuynh MVT
 
Giáo trình c++ full tiếng việt
Giáo trình c++ full tiếng việtGiáo trình c++ full tiếng việt
Giáo trình c++ full tiếng việtMôi Trường Việt
 
Phần 7: Mảng một chiều
Phần 7: Mảng một chiềuPhần 7: Mảng một chiều
Phần 7: Mảng một chiềuHuy Rùa
 
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...Thanh Giảng Lê
 

What's hot (18)

Hướng dẫn lập trình CMS Joomla 2.5
Hướng dẫn lập trình CMS Joomla 2.5 Hướng dẫn lập trình CMS Joomla 2.5
Hướng dẫn lập trình CMS Joomla 2.5
 
Bai09 ngoai levaxulyngoaile
Bai09 ngoai levaxulyngoaileBai09 ngoai levaxulyngoaile
Bai09 ngoai levaxulyngoaile
 
giao trinh c++ Chuong1
giao trinh c++ Chuong1giao trinh c++ Chuong1
giao trinh c++ Chuong1
 
Lesson09
Lesson09Lesson09
Lesson09
 
Bài tập nhập môn lập trình
Bài tập nhập môn lập trìnhBài tập nhập môn lập trình
Bài tập nhập môn lập trình
 
Chuong1 c
Chuong1 c Chuong1 c
Chuong1 c
 
Lesson07
Lesson07Lesson07
Lesson07
 
Chuong3 c
Chuong3 c Chuong3 c
Chuong3 c
 
3 Function
3 Function3 Function
3 Function
 
Tin học ứng dụng trong kinh doanh data4u
Tin học ứng dụng trong kinh doanh data4uTin học ứng dụng trong kinh doanh data4u
Tin học ứng dụng trong kinh doanh data4u
 
Tai lieu huong_dan_hoc_matlab_danh_cho_mon_xu_ly_anh_rat_hay_2264_7433
Tai lieu huong_dan_hoc_matlab_danh_cho_mon_xu_ly_anh_rat_hay_2264_7433Tai lieu huong_dan_hoc_matlab_danh_cho_mon_xu_ly_anh_rat_hay_2264_7433
Tai lieu huong_dan_hoc_matlab_danh_cho_mon_xu_ly_anh_rat_hay_2264_7433
 
B%c3%a1o%20c%c3%a1o%20gi%e1%ba%a3i%20t%c3%a dch%202
B%c3%a1o%20c%c3%a1o%20gi%e1%ba%a3i%20t%c3%a dch%202B%c3%a1o%20c%c3%a1o%20gi%e1%ba%a3i%20t%c3%a dch%202
B%c3%a1o%20c%c3%a1o%20gi%e1%ba%a3i%20t%c3%a dch%202
 
Ngon ngu c theo chuan ansi
Ngon ngu c theo chuan ansiNgon ngu c theo chuan ansi
Ngon ngu c theo chuan ansi
 
Giáo trình c++ full tiếng việt
Giáo trình c++ full tiếng việtGiáo trình c++ full tiếng việt
Giáo trình c++ full tiếng việt
 
Phần 7: Mảng một chiều
Phần 7: Mảng một chiềuPhần 7: Mảng một chiều
Phần 7: Mảng một chiều
 
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
 
Matlab intro
Matlab introMatlab intro
Matlab intro
 
Ctdl lab01
Ctdl lab01Ctdl lab01
Ctdl lab01
 

Viewers also liked

Dijelovi bicikla bini za sigurnost
Dijelovi bicikla bini za sigurnostDijelovi bicikla bini za sigurnost
Dijelovi bicikla bini za sigurnostprometna
 
Presentation of the KansaiScene API at #kansaimashapp
Presentation of the KansaiScene API at #kansaimashappPresentation of the KansaiScene API at #kansaimashapp
Presentation of the KansaiScene API at #kansaimashappMartin Heidegger
 
Services offered by dental clinics in melbourne
Services offered by dental clinics in melbourneServices offered by dental clinics in melbourne
Services offered by dental clinics in melbourneErahealth City Clinic
 
The story of a perpetual learner
The story of a perpetual learner The story of a perpetual learner
The story of a perpetual learner Ali Mujahid
 
Natjecanja školskih prometnih jedinica
Natjecanja školskih prometnih jedinicaNatjecanja školskih prometnih jedinica
Natjecanja školskih prometnih jedinicaprometna
 
Ashish LOYOLA PATNA
Ashish LOYOLA PATNAAshish LOYOLA PATNA
Ashish LOYOLA PATNAPrince Kumar
 
UCSY CS Club Week2
UCSY CS Club Week2UCSY CS Club Week2
UCSY CS Club Week2Ye Linn Wai
 
The greatest vision of the bible dan 8
The greatest vision  of the bible     dan 8The greatest vision  of the bible     dan 8
The greatest vision of the bible dan 8Nick Pellicciotta
 
Kolnik i kretanje pješaka kolnikom
Kolnik i kretanje pješaka kolnikomKolnik i kretanje pješaka kolnikom
Kolnik i kretanje pješaka kolnikomprometna
 
Were we come from,were we going
Were we come from,were we goingWere we come from,were we going
Were we come from,were we goingNick Pellicciotta
 
Prometna Učilica - Biciklističke staze ili trake
Prometna Učilica - Biciklističke staze ili trakePrometna Učilica - Biciklističke staze ili trake
Prometna Učilica - Biciklističke staze ili trakeprometna
 

Viewers also liked (15)

Dijelovi bicikla bini za sigurnost
Dijelovi bicikla bini za sigurnostDijelovi bicikla bini za sigurnost
Dijelovi bicikla bini za sigurnost
 
Presentation of the KansaiScene API at #kansaimashapp
Presentation of the KansaiScene API at #kansaimashappPresentation of the KansaiScene API at #kansaimashapp
Presentation of the KansaiScene API at #kansaimashapp
 
Services offered by dental clinics in melbourne
Services offered by dental clinics in melbourneServices offered by dental clinics in melbourne
Services offered by dental clinics in melbourne
 
The story of a perpetual learner
The story of a perpetual learner The story of a perpetual learner
The story of a perpetual learner
 
Natjecanja školskih prometnih jedinica
Natjecanja školskih prometnih jedinicaNatjecanja školskih prometnih jedinica
Natjecanja školskih prometnih jedinica
 
Ashish LOYOLA PATNA
Ashish LOYOLA PATNAAshish LOYOLA PATNA
Ashish LOYOLA PATNA
 
UCSY CS Club Week2
UCSY CS Club Week2UCSY CS Club Week2
UCSY CS Club Week2
 
The greatest vision of the bible dan 8
The greatest vision  of the bible     dan 8The greatest vision  of the bible     dan 8
The greatest vision of the bible dan 8
 
Kolnik i kretanje pješaka kolnikom
Kolnik i kretanje pješaka kolnikomKolnik i kretanje pješaka kolnikom
Kolnik i kretanje pješaka kolnikom
 
Crating gif
Crating gifCrating gif
Crating gif
 
Were we come from,were we going
Were we come from,were we goingWere we come from,were we going
Were we come from,were we going
 
Time management
Time managementTime management
Time management
 
Prometna Učilica - Biciklističke staze ili trake
Prometna Učilica - Biciklističke staze ili trakePrometna Učilica - Biciklističke staze ili trake
Prometna Učilica - Biciklističke staze ili trake
 
test2
test2test2
test2
 
Facebook Presentation
Facebook  PresentationFacebook  Presentation
Facebook Presentation
 

Similar to Lesson07 (20)

Lesson08
Lesson08Lesson08
Lesson08
 
Chuong5 (2)
Chuong5 (2)Chuong5 (2)
Chuong5 (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
 
C10 generic algorithms
C10 generic algorithmsC10 generic algorithms
C10 generic algorithms
 
C10 generic algorithms
C10 generic algorithmsC10 generic algorithms
C10 generic algorithms
 
Tut5 solution
Tut5 solutionTut5 solution
Tut5 solution
 
Các kiểu Lập trình
Các kiểu Lập trìnhCác kiểu Lập trình
Các kiểu Lập trình
 
Các kiểu Lập trình
Các kiểu Lập trìnhCác kiểu Lập trình
Các kiểu Lập trình
 
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
 
Lab 01
Lab 01Lab 01
Lab 01
 
Session 11
Session 11Session 11
Session 11
 
Session 11
Session 11Session 11
Session 11
 
Tut6 solution
Tut6 solutionTut6 solution
Tut6 solution
 
Session 4
Session 4Session 4
Session 4
 
344444
344444344444
344444
 
Bai tap thuc hanh
Bai tap thuc hanhBai tap thuc hanh
Bai tap thuc hanh
 
Chapter04_Array_chinhsua
Chapter04_Array_chinhsuaChapter04_Array_chinhsua
Chapter04_Array_chinhsua
 
Giao trinh bai tap c va c++
Giao trinh bai tap c va c++Giao trinh bai tap c va c++
Giao trinh bai tap c va c++
 
Giao trinh bai tap c va c++
Giao trinh bai tap c va c++Giao trinh bai tap c va c++
Giao trinh bai tap c va c++
 
Neural Network from Scratch
Neural Network from ScratchNeural Network from Scratch
Neural Network from Scratch
 

More from Tuan Nguyen

More from Tuan Nguyen (8)

Lesson06
Lesson06Lesson06
Lesson06
 
Lesson05
Lesson05Lesson05
Lesson05
 
Lesson04
Lesson04Lesson04
Lesson04
 
Lesson03
Lesson03Lesson03
Lesson03
 
Lesson02
Lesson02Lesson02
Lesson02
 
Lesson01
Lesson01Lesson01
Lesson01
 
Lesson00
Lesson00Lesson00
Lesson00
 
Cac giai thuat co ban
Cac giai thuat co banCac giai thuat co ban
Cac giai thuat co ban
 

Lesson07

  • 1. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 1 LỚPLỚP Bộ môn Hệ Thống Máy Tính và Truyền Thông Khoa Công Nghệ Thông Tin và Truyền Thông Đại học Cần Thơ CHƯƠNG 7:CHƯƠNG 7: (CLASS)(CLASS)
  • 2. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 2 Nội dungNội dung  Lớp – Quyền truy xuất  Khai báo, định nghĩa 1 lớp đơn giản  Hàm thành viên nội tuyến (inline)  Hàm xây dựng (constructor)  Hàm hủy (destructor)  Hàm bạn (friend) – Lớp bạn  Đối số mặc định  Đối số thành viên ẩn (con trỏ this) Chương 7
  • 3. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 3 Nội dung (tt)Nội dung (tt)  Toán tử phạm vi  Danh sách khởi tạo thành viên  Thành viên hằng - Thành viên tĩnh  Thành viên tham chiếu  Thành viên là đối tượng của 1 lớp  Mảng các đối tượng  Phạm vi lớp  Cấu trúc (structure) và hợp (union)  Các trường bit Chương 7
  • 4. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 4 Khái niệm lớpKhái niệm lớp Chương 7  Lớp: kiểu dữ liệu trừu tượng. TÊN LỚPTÊN LỚP Dữ liệu thành viên Hàm thành viên Đặc tả đối tượng Tập các thao tác class TÊNLỚPTÊNLỚP [: <Quyền truy xuất> LỚPCHALỚPCHA ] { <Quyền truy xuất > : DataType1 memberdata1; DataType2 memberdata2; ……………. < Quyền truy xuất > : memberFunction1(); memberFunction2(); ………….. }; private protected public
  • 5. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 5 Lớp đơn giảnLớp đơn giản  Ví dụ: Chương 7 class PointPoint { int xVal, yVal; public: void SetPt (int, int); void OffsetPt (int, int); }; void PointPoint::SetPt (int x, int y) { xVal = x; yVal = y; } void PointPoint::OffsetPt (int x, int y) { xVal += x; yVal += y; } void main() { Point pt; pt.SetPt(10,20); pt.OffsetPt(2,2); …….. pt.xVal = 10; // Đúng hay sai? Point pt1, pt2, pt3; ………. } Gọi hàm trên đối tượng Tạo ra đối tượng thuộc lớp Point Khai báo Lớp Định nghĩa các hàm thành viên
  • 6. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 6 Hàm thành viên nội tuyếnHàm thành viên nội tuyến  Hàm inlineinline:  Cải thiện tốc độ thực thi  Tốn bộ nhớ (dành cho mã lệnh) khi thực thi. Chương 7 class PointPoint { int xVal, yVal; public: void SetPt (int, int); void OffsetPt (int, int); }; inline void PointPoint::SetPt (int x, int y) { xVal = x; yVal = y; } …………… class PointPoint { int xVal, yVal; public: void SetPt (int x, int y) { xVal = x; yVal = y; } void OffsetPt (int x, int y) { xVal += x; yVal += y; } }; Cách 2Cách 2: Định nghĩa bên trong lớp Cách 1Cách 1: thêm Từ khóa inline
  • 7. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 7 Ví dụ - Lớp Set (tập hợp)Ví dụ - Lớp Set (tập hợp) Chương 7 #include <iostream.h> const maxCard = 100; enum Bool {false, true}; class SetSet { private: int elems[maxCard]; int card; public: void EmptySet(){ card = 0; } Bool IsMember (const int); void AddElem (const int); void RmvElem (const int); void Copy (Set&); Bool Equal (Set&); void Intersect (Set&, Set&); void Union (Set&, Set&); void Print (); }; Bool Set::IsMember (const int elem) { for (register i = 0; i < card; ++i) if (elems[i] == elem) return true; return false; } void Set::AddElem (const int elem) { if (IsMember(elem)) return; if (card < maxCard) elems[card++] = elem; else cout << "Set overflow“<<endl; } void Set::RmvElem (const int elem) { for (register i = 0; i < card; ++i) if (elems[i] == elem) { for (; i < card-1; ++i) // Dịch elems[i] = elems[i+1]; --card; } }
  • 8. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 8 Ví dụ - Lớp Set (tt)Ví dụ - Lớp Set (tt) Chương 7 void Set::Copy (Set &set) { for (register i = 0; i < card; ++i) set.elems[i] = elems[i]; set.card = card; } Bool Set::Equal (Set &set) { if (card != set.card) return false; for (register i = 0; i < card; ++i) if (!set.IsMember(elems[i])) return false; return true; } void Set::Print (void) { cout << "{"; for (int i = 0; i < card-1; ++i) cout << elems[i] << ","; if (card > 0) cout << elems[card-1]; cout << "}“<<endl; } ……… int main (void) { Set s1, s2; s1.EmptySet(); s2.EmptySet(); s1.AddElem(10); s1.AddElem(20); s1.AddElem(30); s1.AddElem(40); s2.AddElem(30); s2.AddElem(50); s2.AddElem(10); s2.AddElem(60); cout << "s1 = "; s1.Print(); cout << "s2 = "; s2.Print(); s2.RmvElem(50); cout << "s2 - {50} = "; s2.Print(); if (s1.IsMember(20)) cout << "20 is in s1n"; if (!s1.Equal(s2)) cout << "s1 <> s2n"; return 0; } KếtKết quả ?quả ?
  • 9. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 9 Hàm xây dựngHàm xây dựng Chương 7  Dùng để định nghĩađịnh nghĩa và khởi tạokhởi tạo đối tượng cùng 1 lúc.  Có tên trùng với tên lớp, không có kiểu trả về.  Không gọi trực tiếp, sẽ được tự động gọi khi khởi tạo đt.  Gán giá trị, cấp vùng nhớGán giá trị, cấp vùng nhớ cho các dữ liệu thành viêndữ liệu thành viên. class PointPoint { int xVal, yVal; public: Point (int x, int y) { xVal = x; yVal = y; } void OffsetPt (int x, int y) { xVal += x; yVal += y; } }; void main() { Point pt1(10,20); pt1.OffsetPt(2,2); …….. // Khai báo nào là sai ? Point pt2; Point pt3(); Point pt4 = Point(5,5); Point pt5 = new Point(5,5); ………. }
  • 10. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 10 Hàm xây dựng (tt)Hàm xây dựng (tt) Chương 7 class PointPoint { int xVal, yVal; public: Point () // Hàm xây dựng mặc nhiên { xVal = 0; yVal = 0; } Point (int x, int y) { xVal = x; yVal = y; } Point (float len, float angle) { xVal = (int) (len * cos(angle)); yVal = (int) (len * sin(angle)); } void OffsetPt (int , int ); … }; void main() { Point p1; Point p2(10,20); Point p3(60.3, 3.14); } class SetSet { private: int *elems; int maxCard; int card; public: Set(const int size) { elems = new int[size]; maxCard = size; card = 0; } …………… }; void main() { Set s1(100); Set s2(20); Set s3(1000); … } Mềm dẻo hơn Không cần phải nhớ gọi hàm EmptySet()EmptySet() khi khởi tạo
  • 11. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 11 Hàm hủyHàm hủy Chương 7  Dọn dẹp 1 đối tượng trước khitrước khi nó được thu hồi.  Cú pháp: ~TenLop() { ……... }  Không gọi trực tiếp, sẽ được tự động gọi khi hủy bỏ đt.  Thu hồi vùng nhớThu hồi vùng nhớ cho các dữ liệu thành viêndữ liệu thành viên là con trỏcon trỏ. class SetSet { private: int *elems; int maxCard; int card; public: Set(const int size) { …… } ~Set() { delete[] elems; } …. }; Set TestFunct1(Set s1) { Set *s = new Set(50); return *s; } void main() { Set s1(40), s2(50); s2 = TestFunct1(s1); } Tổng cộng có baobao nhiêu lầnnhiêu lần hàm hủy được gọi ?
  • 12. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 12 Bạn (Friend) – Đặt vấn đềBạn (Friend) – Đặt vấn đề class IntSetIntSet { public: //... private: int elems[maxCard]; int card; }; class RealSetRealSet { public: //... private: float elems[maxCard]; int card; }; Tập Các Số Nguyên Tập Các Số Thực void IntSet::SetToReal (RealSet &set) { set.card = card; for (register i = 0; i < card; ++i) set.elems[i] = (float) elems[i]; } Hàm SetToReal dùng để chuyển tập số nguyên thành tập số thực Làm thế nào để thực hiện được việc truy xuất đến thành viên PrivatePrivate ?
  • 13. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 13 Hàm bạn (Friend)Hàm bạn (Friend)  Cách 1: Khai báo hàm thành viên của lớp IntSet là bạnbạn (friendfriend) của lớp RealSet. class IntSetIntSet { public: //... private: int elems[maxCard]; int card; }; class RealSetRealSet { public: //... friend void IntSet::SetToRealSetToReal (RealSet&); private: float elems[maxCard]; int card; }; Giữ nguyên định nghĩa của lớp IntSet Thêm dòng khai báo Friend cho hàm thành viên SetToReal
  • 14. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 14 Hàm bạn (Friend)Hàm bạn (Friend)  Cách 2:  Chuyển hàm SetToReal ra ngoài (độc lậpđộc lập).  Khai báo hàm đó là bạnbạn của cả 2 lớp. class IntSetIntSet { public: //... friend void SetToReal (IntSet &, RealSet&); private: int elems[maxCard]; int card; }; class RealSetRealSet { public: //... friend void SetToReal (IntSet &, RealSet&); private: float elems[maxCard]; int card; }; void SetToRealSetToReal (IntSet& iSet, RealSet& rSet ) { rSet.card = iSet.card; for (int i = 0; i < iSet.card; ++i) rSet.elems[i] = (float) iSet.elems[i]; } Hàm độc lập là bạn(friend) của cả 2 lớp.
  • 15. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 15 Bạn (Friend)Bạn (Friend)  Hàm bạnHàm bạn:  Có quyền truy xuất đến tất cả các dữ liệudữ liệu và hàmhàm thành viên (protected + private) của 1 lớp.  Lý do:  Cách định nghĩa hàm chính xác.  Hàm cài đặt không hiệu quả.  Lớp bạnLớp bạn:  Tất cả các hàm trong lớp bạn: là hàm bạn. class A; class B { // ………. friend class A; }; class IntSetIntSet { ……….. } class RealSetRealSet { // ………. friend class IntSet; };
  • 16. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 16 Đối số mặc địnhĐối số mặc định  Đối số mặc định tính từ bên phải. class PointPoint { int xVal, yVal; public: Point (int x = 0, int y = 0); //... }; void main() { Point p1; // như là ??? Point p2(10); // như là ??? Point p3(10,20); Point p4(, 20); // ????? ….. } class PointPoint { int xVal, yVal; public: Point (int x = 0, int y = 0); Point (float x=0, float y=0); //... }; void main() { Point p2(1.6, 5.0); // như là ??? Point p3(10,20); // như là ??? Point p4; // ????? ….. } Tối nghĩa Mơ hồ
  • 17. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 17 Đối số thành viên ẩnĐối số thành viên ẩn  Con trỏ *thisCon trỏ *this:  Là 1 thành viên ẩn, có thuộc tính là private.  Trỏ tới chính bản thân đối tượng. void PointPoint::OffsetPt (int x, int y) { xVal += x; yVal += y; } void PointPoint::OffsetPt (int x, int y) { this->xVal += x; this->yVal += y; } • Có những trường hợp sử dụng *this là dư thừa (Ví dụ trên) • Tuy nhiên, có những trường hợp phải sử dụng con trỏ *this*this
  • 18. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 18 Toán tử phạm viToán tử phạm vi  Toán tử :::: dùng để xác định chính xác hàm (thuộc tính) được truy xuất thuộc lớp nào.  Câu lệnh: pt.OffsetPt(2,2); <=> pt.Point::OffsetPt(2,2);  Cần thiết trong một số trường hợp:  Cách gọi hàm trong thừa kế.  Tên thành viên bị che bởi biến cục bộ. Ví dụ: Point(int xVal, int yVal) { Point::xVal = xVal; Point::yVal = yVal; }
  • 19. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 19 Danh sách khởi tạo thành viênDanh sách khởi tạo thành viên  Tương đương việc gán giá trị dữ liệu thành viên. class ImageImage { public: Image(const int w, const int h); private: int width; int height; //... }; Image::Image(const int w, const int h) { width = w; height = h; //..................... } Image::Image (const int w, const int h) : width(w), height(h) { //............... } class PointPoint { int xVal, yVal; public: Point (int x, int y) { xVal = x; yVal = y; } // …………………… }; Point::Point (int x, int y) : xVal(x), yVal(y) { }
  • 20. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 20 Thành viên hằngThành viên hằng  Hằng dữ liệu thành viên: class ImageImage { public: Image(const int w, const int h); private: const intconst int width; const intconst int height; //... }; Image::Image (const int w, const int h) : width(w), height(h) { //................ } Khai báo bình thường như dữ liệu thành viên class ImageImage { const int width = 256; const int height = 168; //... }; Khởi tạo SAI Khởi tạo ĐÚNG thông qua danh sách khởi tạo thành viên
  • 21. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 21 Thành viên hằngThành viên hằng  Hằng đối tượng: không được thay đổi giá trị.  Hàm thành viên hằng:  Được phép gọi trên hằng đối tượng.  Không được thay đổi giá trị dữ liệu thành viên. class SetSet { public: Set(void){ card = 0; } Bool Member(const int) const; void AddElem(const int); //... }; Bool Set::Member (const int elem) const { //... } void main() { const Set s; s.AddElem(10); // SAI s.Member(10); // ok }
  • 22. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 22 Thành viên tĩnhThành viên tĩnh  Dữ liệu thành viên tĩnh:  Dùng chung 1 bản sao chép (1 vùng nhớ) chia sẻ cho tất cả đối tượng của lớp đó.  Sử dụng: <TênLớp>::<TênDữLiệuThànhViên>  Thường dùng để đếm số lượng đối tượng. class WindowWindow { // danh sách liên kết tất cả Window static Window *first; // con trỏ tới window kế tiếp Window *next; //... }; Window *Window::Window::first = &myWindow; // ……………. Khởi tạo dữ liệu thành viên tĩnh Khai báo
  • 23. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 23 Thành viên tĩnhThành viên tĩnh  Hàm thành viên tĩnh:  Tương đương với hàm toàn cục.  Gọi thông qua: <TênLớp>::<TênHàm> class WindowWindow { // ………. static void PaintProc () { ….. } // ……… }; void main() { // ……………. Window::Window::PainProc(); } Truy xuất hàm thành viên tĩnh Khai báo Định nghĩa hàm thành viên tĩnh
  • 24. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 24 class Image { int width; int height; int &widthRef = width; //... }; Thành viên tham chiếuThành viên tham chiếu  Tham chiếu dữ liệu thành viên: class Image { int width; int height; int &widthRef; //... }; Image::Image (const int w, const int h) : widthRef(width) { //……………... } Khai báo bình thường như dữ liệu thành viên Khởi tạo SAI Khởi tạo ĐÚNG thông qua danh sách khởi tạo thành viên
  • 25. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 25 Thành viên là đối tượng của 1 lớpThành viên là đối tượng của 1 lớp  Dữ liệu thành viên có thể có kiểu:  Dữ liệu (lớp) chuẩn của ngôn ngữ.  Lớp do người dùng định nghĩa (có thể là chính lớp đó). class Point { ……. }; class RectangleRectangle { public: Rectangle (int left, int top, int right, int bottom); //... private: Point topLeft; Point botRight; }; Rectangle::Rectangle (int left, int top, int right, int bottom) : topLeft(left,top), botRight(right,bottom) { } Khởi tạo cho các dữ liệu thành viên qua danh sách khởi tạo thành viên
  • 26. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 26 Mảng các đối tượngMảng các đối tượng  Sử dụng hàm xây dựng không đối số (hàm xây dựng mặc nhiên - default constructor). VD: Point pentagon[5];  Sử dụng bộ khởi tạo mảng: VD: Point triangle[3] = { Point(4,8), Point(10,20), Point(35,15) }; Ngắn gọn: Set s[4] = { 10, 20, 30, 40 }; tương đương với: Set s[4] = { Set(10), Set(20), Set(30), Set(40) };
  • 27. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 27 Mảng các đối tượngMảng các đối tượng  Sử dụng dạng con trỏ:  Cấp vùng nhớ: VD: Point *pentagon = new Point[5];  Thu hồi vùng nhớ: delete[] pentagon; delete pentagon; // Thu hồi vùng nhớ đầu class PolygonPolygon { public: //... private: Point *vertices; // các đỉnh int nVertices; // số các đỉnh }; Không cần biết kích thước mảng.
  • 28. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 28 Phạm vi lớpPhạm vi lớp  Thành viên trong 1 lớp:  Che các thực thể trùng tên trong phạm vi. // ……… int fork (void); // fork hệ thống class ProcessProcess { int fork (void); // fork thành viên //... }; // ……… int Process::func1 (void) { int x = fork(); // gọi fork cục bộ int pid = ::fork(); // gọi hàm fork hệ thống //... } fork thành viên che đi fork toàn cục trong phạm vi lớp Process
  • 29. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 29 Phạm vi lớpPhạm vi lớp  Lớp toàn cục: đại đa số lớp trong C++.  Lớp lồng nhau: lớp chứa đựng lớp.  Lớp cục bộ: trong 1 hàm hoặc 1 khối. class RectangleRectangle { // Lớp lồng nhau public: Rectangle (int, int, int, int); //.. private: class Point { public: Point(int a, int b) { … } private: int x, y; }; Point topLeft, botRight; }; Rectangle::Point pt(1,1); // sd ở ngoài void Render (Image &i) { class ColorTableColorTable { public: ColorTable () { /* ... */ } AddEntry (int r, int g, int b) { /* ... */ } //... }; ColorTable colors; //... } ColorTable ct; // SAI
  • 30. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 30 Cấu trúc và hợpCấu trúc và hợp  Cấu trúc (structure):  Bắt nguồn từ ngôn ngữ C.  Tương đương với class với các thuộc tính là public.  Sử dụng như class. struct PointPoint { Point (int, int); void OffsetPt(int, int); int x, y; }; class PointPoint { public: Point(int, int); void OffsetPt(int, int); int x, y; }; Point p = { 10, 20 }; Có thể khởi tạo dạng này nếu không có định nghĩa hàm xây dựng
  • 31. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 31 Cấu trúc và hợpCấu trúc và hợp  Hợp (union):  Tất cả thành viên ánh xạ đến cùng 1 địa chỉ bên trong đối tượng chính nó (không liên tiếp).  Kích thước = kích thước của dữ liệu lớn nhất. union ValueValue { long integer; double real; char *string; Pair list; //... }; Kích thước của Value là 8 bytes = sizeof(double) class PairPair { Value *head; Value *tail; //... }; class ObjectObject { private: enum ObjType {intObj, realObj, strObj, listObj}; ObjType type; // kiểu đối tượng Value val; // giá trị của đối tượng //... };
  • 32. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 32 Các trường bitCác trường bit  Điều khiển đối tượng ở mức bit. VD: Truy xuất các bit trong header của gói tin. typedef unsigned int BitBit; class PacketPacket { Bit type : 2; // rộng 2 bit Bit acknowledge : 1; // rộng 1 bit Bit channel : 4; // rộng 4 bit Bit sequenceNo : 4; // rộng 4 bit Bit moreData : 1; // rộng 1 bit //... }; enum PacketType { dataPack, controlPack, supervisoryPack }; enum Bool { false, true }; // ………… PacketPacket p; p.type = controlPack; p.acknowledge = true;