Violet
Baigiang

Tìm kiếm theo tiêu đề

Tin tức thư viện

Khắc phục hiện tượng không xuất hiện menu Bộ công cụ Violet trên PowerPoint và Word

12099162 Kính chào các thầy, cô. Khi cài đặt phần mềm , trên PowerPoint và Word sẽ mặc định xuất hiện menu Bộ công cụ Violet để thầy, cô có thể sử dụng các tính năng đặc biệt của phần mềm ngay trên PowerPoint và Word. Tuy nhiên sau khi cài đặt phần mềm , với nhiều máy tính sẽ...
Xem tiếp

Quảng cáo

Hỗ trợ kĩ thuật

Liên hệ quảng cáo

  • (024) 66 745 632
  • 096 181 2005
  • contact@bachkim.vn

Tìm kiếm Bài giảng

Slide bài giảng lập trình hướng đối tượng C++ (chương 7)

Wait
  • Begin_button
  • Prev_button
  • Play_button
  • Stop_button
  • Next_button
  • End_button
  • 0 / 0
  • Loading_status
Nhấn vào đây để tải về
Báo tài liệu có sai sót
Nhắn tin cho tác giả
(Tài liệu chưa được thẩm định)
Nguồn:
Người gửi: Trung Kien
Ngày gửi: 09h:38' 02-05-2008
Dung lượng: 231.0 KB
Số lượt tải: 49
Số lượt thích: 0 người
LỚ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:
(CLASS)
Nộ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
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
Khái niệm lớp
Chương 7
Lớp: kiểu dữ liệu trừu tượng.
Đặc tả đối tượng
Tập các thao tác

class TÊNLỚP
[: LỚPCHA ]
{ :
DataType1 memberdata1;
DataType2 memberdata2;
…………….
< Quyền truy xuất > :
memberFunction1();
memberFunction2();
…………..
};

Lớp đơn giản
Ví dụ:
Chương 7

class Point {
int xVal, yVal;
public:
void SetPt (int, int);
void OffsetPt (int, int);
};

void Point::SetPt (int x, int y) {
xVal = x;
yVal = y;
}
void Point::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;
……….

}
Định nghĩa
các hàm
thành viên
Hàm thành viên nội tuyến
Hàm inline:
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 Point {
int xVal, yVal;
public:
void SetPt (int, int);
void OffsetPt (int, int);
};

inline void Point::SetPt (int x, int y) {
xVal = x;
yVal = y;
}
……………

class Point {
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 2:

Định
nghĩa
bên
trong
lớp
Ví dụ - Lớp Set (tập hợp)
Chương 7
#include
const maxCard = 100;
enum Bool {false, true};
class Set {
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“<}
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;
}
}
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 << "}“<}
………
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 s1 ";
if (!s1.Equal(s2))
cout << "s1 <> s2 ";
return 0;
}
Kết
quả ?
Hàm xây dựng
Chương 7
Dùng để định nghĩa và khở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ớ cho các dữ liệu thành viên.

class Point {
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);
……….
}
Hàm xây dựng (tt)
Chương 7

class Point {
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 Set {
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()
khi khởi tạo
Hàm hủy
Chương 7
Dọn dẹp 1 đối tượng trướ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ớ cho các dữ liệu thành viên là con trỏ.

class Set {
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ó bao nhiêu lần hàm hủy được gọi ?
Bạn (Friend) – Đặt vấn đề


class IntSet {
public:
//...
private:
int elems[maxCard];
int card;
};

class RealSet {
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
Private ?
Hàm bạn (Friend)
Cách 1: Khai báo hàm thành viên của lớp IntSet là bạn (friend) của lớp RealSet.

class IntSet {
public:
//...
private:
int elems[maxCard];
int card;
};

class RealSet {
public:
//...
friend void IntSet::SetToReal (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
Hàm bạn (Friend)
Cách 2:
Chuyển hàm SetToReal ra ngoài (độc lập).
Khai báo hàm đó là bạn của cả 2 lớp.

class IntSet {
public:
//...
friend void SetToReal (IntSet &, RealSet&);
private:
int elems[maxCard];
int card;
};

class RealSet {
public:
//...
friend void SetToReal (IntSet &, RealSet&);
private:
float elems[maxCard];
int card;
};

void SetToReal (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.
Bạn (Friend)
Hàm bạn:
Có quyền truy xuất đến tất cả các dữ liệu và hà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ạ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 IntSet { ……….. }
class RealSet { // ……….
friend class IntSet;
};
Đối số mặc định
Đối số mặc định tính từ bên phải.
class Point {
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 Point {
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ồ
Đối số thành viên ẩn
Con 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 Point::OffsetPt (int x, int y) {
xVal += x;
yVal += y;
}

void Point::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
Toá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;
}
Danh 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 Image {
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 Point {
int xVal, yVal;
public:
Point (int x, int y) {
xVal = x;
yVal = y;
}
// ……………………
};
Point::Point (int x, int y)
: xVal(x), yVal(y)
{ }
Thành viên hằng
Hằng dữ liệu thành viên:
class Image {
public:
Image(const int w, const int h);
private:
const int width;
const 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 Image {
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
Thà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 Set {
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

}
Thà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: ::
Thường dùng để đếm số lượng đối tượng.
class Window {
// 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::first = &myWindow;
// …………….
Thà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: ::
class Window {
// ……….
static void PaintProc () { ….. }
// ………
};

void main() {
// …………….
Window::PainProc();

}
class Image {
int width;
int height;
int &widthRef = width;
//...
};
Thà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
Thà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 Rectangle {
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
Mả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) };
Mả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 Polygon {
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.
Phạ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 Process {
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
Phạ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 Rectangle { // 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 ColorTable {
public:
ColorTable () { /* ... */ }
AddEntry (int r, int g, int b)
{ /* ... */ }
//...
};
ColorTable colors;
//...
}
ColorTable ct; // SAI
Cấ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 Point {
Point (int, int);
void OffsetPt(int, int);
int x, y;
};
class Point {
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
Cấ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 Value {
long integer;
double real;
char *string;
Pair list;
//...
};
Kích thước của Value là 8 bytes = sizeof(double)
class Pair {
Value *head;
Value *tail;
//...
};
class Object {
private:
enum ObjType {intObj, realObj,
strObj, listObj};
ObjType type; // kiểu đối tượng
Value val; // giá trị của đối tượng
//...
};
Cá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 Bit;
class Packet {
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 };
// …………
Packet p;
p.type = controlPack;
p.acknowledge = true;
 
Gửi ý kiến