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

Lớp và đối tượng

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

Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng
1
LỚP và ĐỐI TƢỢNG
Khoa Công Nghệ Thông Tin Đại học
Bách khoa – Đại học Đà Nẵng
CHƢƠNG 3:
(CLASS & OBJECT)
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng
2
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)
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng
3
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
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng


4
Khái niệm lớp
 Lớp: kiểu dữ liệu trừu tƣợng.
TÊ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 Classname {
<Quyền truy xuất > :
DataType1 memberdata1;
DataType2 memberdata2;
…………….
< Quyền truy xuất > :
memberFunction1();
memberFunction2();
…………..
};
private
protected
public
class Point {
int xVal, yVal;
public:
void SetPt (int, int);

void OffsetPt (int, int);
};
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng
5
Đối tượng
 Đối tƣợng(Object): là một thể hiện thuộc lớp, một thực thể
có thực
 Khai báo:
<Classname> <Objectname>;
 Để truy xuất đến một thành phần của đối tƣợng, truy xuất giống
nhƣ kiểu struct
 Thành viên dữ liệu:
Objectname.datamember
 Hàm thành viên:
Objectname. Memberfunction(parameter)
 Ví dụ:
Point pt;
pt.SetPt(10,20);
pt.OffsetPt(2,2);
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng
6
Đóng gói trong C++
 Khái niệm đóng gói có sẵn trong C++ class: ta có thể hạn
chế quyền truy nhập đến các thành viên của đối tƣợng
 Sử dụng một bộ từ khoá để mô tả quyền truy nhập:
 private
 nếu một thành viên của một lớp đƣợc khai báo là private, nó chỉ đƣợc truy nhập đến
từ bên trong lớp đó
 Mặc định: mọi thành viên của class là private, do đó nhấn mạnh khái niệm đóng gói
của lập trình hƣớng đối tƣợng.

 Public
 Các thành viên đƣợc khai báo là public có thể đƣợc truy nhập từ bên ngoài đối
tƣợng
 là mặc định đối với các thành viên của struct
 protected
 friend
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng
7
Đóng gói trong C++
 Khi nào sử dụng quyền nào?
 Theo phong cách lập trình hƣớng đối tƣợng tốt, ta sẽ
giữ mọi thành viên dữ liệu ở dạng private (che dấu dữ
liệu).
 Các phƣơng thức thƣờng khai báo là public để có thể
liên lạc đƣợc với đối tƣợng từ bên ngoài(giao diện của
đối tƣợng).
 Các phƣơng thức tiện ích chỉ đƣợc dùng bởi các
phƣơng thức khác trong cùng lớp nên đƣợc khai báo
private.
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng
8
Ví dụ: Lớp đơn giản
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;
……….
}
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 Bách khoa Đà Nẵng
9
Khai báo các phương thức

 Giao diện của phƣơng thức luôn đặt trong định nghĩa
lớp, cũng nhƣ các khai báo thành viên dữ liệu.
 Phần cài đặt (định nghĩa phƣơng thức) có thể đặt trong
định nghĩa lớp hoặc đặt ở ngoài.
 Hai lựa chọn:
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;
}
class Point {
int xVal, yVal;
public:
void SetPt (int x, int y) {
xVal = x;
yVal = y;
}
void OffsetPt (int, int);
};
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng
10
Khai báo các phương thức
 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.
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;
}
……………
Cách 2:
thêm
Từ
khóa
inline
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 1:
Định
nghĩa

bên
trong
lớp
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng
11
Ví dụ - Lớp Set (tập hợp)
#include <iostream.h>
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“<<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 Bách khoa Đà Nẵng
12
Ví dụ - Lớp Set (tt)
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 s1\n";
if (!s1.Equal(s2))
cout << "s1 <> s2\n";
return 0;
}
Kết

quả ?
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng
13
Đặt khai báo lớp ở đâu?
 Để đảm bảo tính đóng gói, ta thƣờng đặt khai
báo của lớp trong file header
 tên file thƣờng trùng với tên lớp. Ví dụ khai báo lớp
Car đặt trong file “car.h”
 Phần cài đặt (định nghĩa) đặt trong một file
nguồn tƣơng ứng
 “car.cpp” hoặc “car.cc”
 Quy ƣớc đặt khai báo/định nghĩa của lớp trong
file trùng tên lớp đƣợc chấp nhận rộng rãi trong
C++
 là quy tắc bắt buộc đối với các lớp của Java
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng
14
File header car.h
// car.h
#ifndef CAR_H
#define CAR_H
class Car {
public:
//...
void drive(int speed, int distance);
//...
void stop();
//...
void turnLeft();
private:

int vin; //...
string make; //...
string model; //...
string color; //...
};
#endif
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng
15
Định nghĩa các phương thức
 Định nghĩa của các phƣơng thức cần đặt trong 1 file
nguồn trùng tên với tên lớp
 File bắt đầu với các lệnh #include và có thể có các khai
báo using cho các namespace
 Bên cạnh việc include các thƣ viện C++ cần thiết, ta con
phải include header file chứa khai báo lớp
// car.cpp
#include <iostream>
#include <string>
#include “car.h”
using namespace std;
...
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng
16
Định nghĩa các phương thức
 Khi định nghĩa một phƣơng thức, ta cần sử dụng toán tử
phạm vi để trình biên dịch hiểu đó là phƣơng thức của
một lớp cụ thể chứ không phải một hàm thông thƣờng
khác
 Ví dụ, định nghĩa phƣơng thức drive của lớp Car đƣợc viết
nhƣ sau

// car.cpp
...
void Car::drive(int speed, int distance)
{
//method definition
}
Tên lớp
Toán tử định phạm vi
Tên phương thức
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng
17
Định nghĩa các phương thức
 Vậy cấu trúc của file nguồn lớp Car có thể
nhƣ sau:
// car.cpp
#include <iostream.h>
#include <string.h>
#include “car.h”
void Car::drive(int speed, int distance) {…}
void Car::stop() {…}
void Car::turnLeft() {…}
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng
18
Đố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ồ
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng
19
Đố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
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng
20
Con trỏ this
 Tuy không bắt buộc sử dụng tƣờng minh con trỏ this, ta
có thể dùng nó để giải quyết vấn đề tên trùng và phạm vi
void Foo::bar()
{
int x;
x = 5; // local x
this->x = 6; // this instance’s x
}
void Foo::bar(int x)
{
this->x = x;
}
hoặc
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng
21
Con trỏ this
 Con trỏ this đƣợc các phƣơng thức tự động
sử dụng, nên việc ta có sử dụng nó một cách

tƣờng minh hay bỏ qua không ảnh hƣởng đến
tốc độ chạy chƣơng trình
 Nhiều lập trình viên sử dụng this một cách
tƣờng minh mỗi khi truy nhập các thành viên dữ
liệu
 để đảm bảo không có rắc rối về phạm vi
 ngoài ra, còn để tự nhắc rằng mình đang truy nhập
thành viên
 Lựa chọn có dùng hay không là tuỳ ở mỗi ngƣời
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng
22
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;
}
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng
23
Hàm xây dựng (Constructor)
 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.

 Constructor có thể đƣợc khai báo chồng (đa năng hoá) nhƣ các
hàm C++ thông thƣờng khác
 cung cấp các kiểu khởi tạo khác nhau tuỳ theo các đối số đƣợc cho khi
tạo thể hiệ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);
……….
}
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng
24
Hàm xây dựng (tt)
class Point {
int xVal, yVal;

public:
Point (int x=0, int y=0) {
xVal = x; yVal = y;
}
Point (float len=0, float angle=0) {
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
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng
25
Hàm xây dựng
 Đối với constructor mặc định, nếu ta không cung
cấp một phƣơng thức constructor nào, C++ sẽ
tự sinh constructor mặc định là một phƣơng
thức rỗng (không làm gì)
 mục đích để luôn có một constructor nào đó để gọi
khi không có tham số nào
 Tuy nhiên, nếu ta không định nghĩa constructor
mặc định nhƣng lại có các constructor khác,
trình biên dịch sẽ báo lỗi không tìm thấy
constructor mặc định nếu ta không cung cấp
tham số khi tạo thể hiện.

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×