1. Trang chủ
  2. » Công Nghệ Thông Tin

Chapter4 Class trong c++

46 323 3

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 46
Dung lượng 307,94 KB

Nội dung

Class trong c++

Trang 2

4.1 Khái niệm

ƒ Đối tượng là gì?

— Mô hình ₫ại diện của một ₫ối tượng vật lý:

 Person, student, employee, employer

 Car, bus, vehicle,…

— Đối tượng logic

 Trend, report, button, window,…

Trang 3

ƒ Các dữ liệu của lớp ⇒ biến thành viên

ƒ Các hàm của lớp ⇒ hàm thành viên p

ƒ Một biến của một lớp ⇒ một ₫ối tượng

Trang 4

int day, month, year;

set_date(d,32,13,2010); add_day(d,5);

}

void add_year(Date& date, int n) ){

date.year += n;

}

Trang 5

Các vấn ₫ề với struct

ƒ Truy nhập trực tiếp vào các biến thành viên của cấu

trúc → không an toàn

ƒ Khi có sự thay ₫ổi tên của các biến thành viên →

người sử dụng phải thay ₫ổi lại mã chương trình ứng dụng

— Ví dụ: thay ₫ổi lại cấu trúc Date

Trang 6

truy nhập

Hàm thành viên

int get_day() { return day; } int get_month() { return month; } int get_year() { return year; } void add_year(int n) ){

year += n;

Hàm thành viên

}

};

Trang 7

; //

d.year = 2009;//??

int i = d.day;//??

int day = d.get_day();

int month = d.get_month();

int year = d get year();

day, month, year là các biến thành viên của Date thuộc kiểu không ₫ược phép

Trang 8

ƒ Thay ₫ổi tên biến thành viên của lớp y p

class Date{

i t d

//Sử dụngvoid main{

int month = d.get_month(); int year = d.get_year(); }

int get_day() { return d; } int get_month() { return m; } int get_year() { return y; } void add_year(int n) ){

biệt

}

};

biệt không?

Trang 9

d.day = 10;; //Lỗi, vì biến thành viên day của Date thuộc kiểu private

ƒ Có thể cho phép biến thành viên truy nhập từ bên ngoài bằng cách chuyển thành biến public Tuy nhiên, ít khi sử dụng như vậy vì không còn che giấu dữ liệu

class Date{

public:

int day,month, year; y, , y ; //truy nhập ₫ược từ bên ngoàiy ập ợ g

Trang 10

ƒ Truy nhập các biến thành viên thông qua các hàm

thành viên

class Date{

int day, month,year;

public:

int get day() { return day; } ₫ể tHàm thành viên hậ biế

int get_day() { return day; }

void set_day(int d){ day = d; }};

₫ể truy nhập biến thành viên

ƒ Khởi tạo biến thành viên thông qua hàm tạo

ƒ Khởi tạo biến thành viên thông qua hàm tạo

class Date{

int day, month,year;

public:

p

Date(int d, int m, int y){ // hàm tạo

day = d; month = m; year = y;

}

};

Trang 11

.};

void Date::set_day(int d){

day = d;

Chỉ khai báo, không ₫ịnh nghĩa

Đị h hĩ bê

ngoài phần khai báo lớp

ƒ Để che giấu cách thực hiện hàm thành viên thường ₫ược khai Để che giấu cách thực hiện, hàm thành viên thường ₫ược khai báo trong tập tin ₫ầu (*.h), phần ₫ịnh nghĩa ₫ược thực hiện

trong tệp tin nguồn (*.cpp) Khi ₫óng gói thành thư viện, người

sử dụng chỉ cần tệp tin thư viện (*.lib) và tệp tin ₫ầu (*.h),

khô ầ tệ ti ồ (* )

không cần tệp tin nguồn (*.cpp)

Trang 12

ƒ Khai báo hàm thành viên trong tệp tin ₫ầu (* h)

ƒ Khai báo hàm thành viên trong tệp tin ₫ầu ( h)

Trang 13

Con trỏ ₫ối tượng

ƒ Sử dụng con trỏ ₫ối tượng

Date *pd2 = new Date[5];

for(int i = 0 ;i < 5; i++)

pd2[i].set_date(1,1,2010);

delete [] pd2;

}

Trang 14

4.5 Kiểm soát truy nhập

ƒ private : các thành viên chỉ có thể truy nhập từ các

thành viên của lớp và từ các bạn bè của lớp

ƒ public : các thành viên công cộng, truy nhập ₫ược ở

mọi nơi

ƒ protected : các thành viên không truy nhập ₫ược từ

ƒ protected : các thành viên không truy nhập ₫ược từ

bên ngoài, nhưng truy nhập ₫ược từ lớp dẫn xuất

Lớp cơ sở

Trang 15

4.6 Bài tập

ƒ Xây dựng một lớp tên person ₫ể ₫ại diện cho một

người với các yêu cầu:

— Tên có ₫ộ dài tối ₫a 50 ký tự

— Ngày tháng năm sinh thuộc kiểu Date như ₫ã gợi ý trong bài giảng.

— Quê quán có ₫ộ dài tối ₫a 100 ký tự

— Hàm nhập tên, ngày sinh, quê từ bán phím

— Hàm hiển thị thông tin ra màn hình Hàm hiển thị thông tin ra màn hình

— Hàm lấy tên, hàm gán tên

— Hàm lấy quê quán, hàm gán quê quán

Hà lấ gà i h hà g gà i h

— Hàm lấy ngày sinh, hàm gan ngày sinh

— Viết chương trình chính minh họa cách sử dụng

Trang 16

4.7 Hàm tạo và hàm hủy

ƒ Vấn ₫ề 1: Nghiên cứu ₫oạn mã sau

class Date{

int day month year;

int day, month,year;

public:

int get_day() { return day; }

void set_day(int d){ day = d; }};

ƒ Làm thế nào ₫ể sau khi ₫ược tạo ra, ₫ối tượng có

trạng thái ban ₫ầu theo ý muốn của người sử dụng?

ƒ Giải pháp: sử dụng hàm tạo

Trang 17

ƒ Câu hỏi: làm thế nào ₫ể cấp phát bộ nhớ và hủy bộ

nhớ cho biến thành viên data một cách an toàn ộ

ƒ Giải pháp: sử dụng hàm tạo và hàm hủy.

Trang 18

4.7 Hàm tạo và hàm hủy (…)

ƒ Hàm tạo: luôn ₫ược gọi khi ₫ối tượng ₫ược tạo ra

ƒ Hàm hủy: luôn ₫ược gọi khi ₫ối tượng bị hủy

A(int _a){ a = _a;}

A(int _a, int _b){ a = _a; b = _b;}

A()

12

— Hàm tạo 1: hàm tạo không ₫ối

— Hàm tạo 2: hàm tạo một ₫ối

— Hàm tạo 3: hàm tạo hai ₫ối

Trang 19

ƒ Sử dụng

void main{

A a(); //gọi hàm tạo (?)

A a1(10); // gọi hàm tạo (?)

A a2(1 2); // i hà t (?)

A a2(1,2); // gọi hàm tạo (?)} //gọi hàm hủy cho ?

void f(A a){ gọi hàm tạo (?)

void f(A a){

A b(0,0);

if( ){

A c;

gọi hàm tạo (?) gọi hàm tạo (?) gọi hàm hủy cho ?

}}

gọi hàm hủy cho ? gọi hàm hủy cho ?

Trang 20

4.7 Hàm tạo và hàm hủy (…)

ƒ Làm thế nào ₫ể không phải ₫ịnh nghĩa nhiều hàm

tạo như ví dụ trên?

ƒ Giải pháp: sử dụng hàm tạo có tham biến mặc ₫ịnh

void main{

A 1 // 1 ? 1 b ?

A a1; // a1.a = ?; a1.b = ?

A a2(1); // a2.a = ?; a2.b = ?

A a3(1,2); // a3.a = ?; a3.b = ?

};

Trang 21

Tóm tắt về hàm tạo và hàm hủy

ƒ Hàm tạo ₫ược sử dụng ₫ể:

— Cấp phát bộ nhớ ₫ộng

— Khởi tạo các trạng thái ban ₫ầu cho ₫ối tượng

ƒ Một lớp có thể có nhiều hàm tạo Chúng khác nhau ở số lượng các tham số hoặc kiểu của các tham số.

ƒ Nếu không ₫ịnh nghĩa hàm tạo thì compiler sẽ tự ₫ộng sinh ra một hàm tạo với mã thực thi là rỗng dẫn ₫ến:

— Trạng thái ban ₫ầu của các biến thành viên là bất ₫ịnh

— Không cấp phát bộ nhớ ₫ộng cho các biến thành viên dạng mảng

₫ộng

Hà hủ là d hất

ƒ Hàm hủy là duy nhất

ƒ Hàm hủy không bao giờ có ₫ối

ƒ Nếu không ₫ịnh nghĩa hàm hủy thì compiler cũng tự ₫ộng sinh

ra nhưng mã thực thi của hàm hủy này là rỗng

ra nhưng mã thực thi của hàm hủy này là rỗng.

ƒ Khi sử dụng ₫ối tượng ₫ộng (có sử dụng toán tử new ) thì luôn phải nhớ hủy bộ nhớ ₫ã cấp phát cho bộ nhớ ₫ộng khi không cần dùng ₫ến chúng nữa (sử dụng toán tử delete )

ƒ Hàm tạo và hàm hủy có thể ₫ược ₫ịnh nghĩa bên ngoài phần

Trang 22

// ₫ịnh nghĩa hàm tạo và hàm hủy

Array :: Array(int _n, int _d){

data = new int[n];

for(int i = 0; i < n; i++)

Trang 23

( );

}

Trang 24

ƒ Hàm tạo bản sao ₫ược gọi khi sao chép ₫ối tượng:

— Khi khai báo các biến x2-x4 như sau:

sao để sao chép nội dung của

a để truyền vào cho tham biến hình thức x của hàm f

- Khi một hàm trả về một ₫ối tượng

X f() {

X x1;

// thực hiện thuật toán

// thực hiện thuật toánreturn x1;

X x f();

Trang 25

ƒ Nếu không ₫ịnh nghĩa hàm tạo bản sao thì compiler

sẽ tự sinh ra và sao chép từng bít

ƒ Lớp không có tham biến ₫ược cấp phát ₫ộng thì

không cần ₫ịnh nghĩa hàm tạo bản sao g g

ƒ Khi có tham biến ₫ược cấp phát ₫ộng thì bắt buộc

₫ịnh nghĩa lại hàm tạo bản sao.

//khai báo lớp Array không có hàm tạo bản sao

void set_data(int i, int d){

if((i>=0) && (i<n))

data[i] = d;

};

};

Trang 26

Array :: Array(const Array & a){

Trang 27

4.8 Hàm tạo bản sao (…)

ƒ Định nghĩa hàm tạo bản sao cho lớp Array như sau

Array :: Array( const Array & a) {

Array :: Array( const Array & a) {

n = a.n;

data = new int[n];

for ( ( int i=0; i < n; ++i) ; ; ) data[i] = a.data[i];

}

ƒ Khi một lớp phải ₫ịnh nghĩa hàm hủy thì cũng cần

ƒ Khi một lớp phải ₫ịnh nghĩa hàm hủy thì cũng cần

thiết ₫ịnh nghĩa lại hàm tạo bản sao

ƒ Trong trường hợp muốn cấm sao chép thì ta khai báo hàm tạo bản sao trong phần private.

Trang 28

Con trỏ this

ƒ Từ khóa this ₫ược dùng trong khi ₫ịnh nghĩa các

hàm thành viên dùng ₫ể trỏ ₫ến ₫ối tượng hiện tại

ƒ Nói chung, con trỏ this ít khi ₫ược sử dụng tường

minh, vì nó ₫ã ₫ược ngầm sử dụng khi truy nhập vào các thành phần dữ liệu Nó thường ₫ược sử dụng khi

các thành phần dữ liệu Nó thường ₫ược sử dụng khi chúng ta muốn lấy ₫ịa chỉ của ₫ối tượng hiện tại (như

₫ể trỏ vào chính ₫ối tượng ₫ó)

Trang 29

ƒ Không ₫ịnh nghĩa hàm toán tử gán, compiler sẽ tự

₫ộng sinh ra và gán từng bít (giống với hàm tạo bản sao)

sao)

Trang 30

ƒ a1.data và a.data cùng trỏ vào một vùng nhớ → kết quả tương

Trang 32

data[i] = a.data[i];

Trang 33

Bài tập

ƒ Định nghĩa lớp Array có các yêu cầu sau

— Hàm tạo, hàm hủy, hàm tạo bản sao, hàm toán tử gán

— Các hàm cho phép nhập dữ liệu vào từ bàn phím và hiển thị

Trang 34

ƒ Giải pháp: ₫ưa biến count là một biến static của lớp Date

class Date{

int day, month,year;

static int count;

Date(int d, int m, int y);

Khai báo

(){

Trang 35

4.10 Thành viên tĩnh(…)

ƒ Hàm thành viên tĩnh

class A{

Trong hàm thành viên tĩnh chỉ sử dụng được các biến thành viên tĩnh và chỉ gọi

void f();

static void g();

};

đối tượng ngầm định *this.

int A:: count = 0;

Trang 36

Kết luận về thành viên tĩnh

ƒ Được cấp phát một vùng nhớ cố ₫ịnh, tồn tại ngay cả khi lớp chưa có một ₫ối tượng nào

ƒ Chung cho cả lớp, không phải của riêng mỗi ₫ối tượng

ƒ Để biểu thị thành phần tĩnh ta dùng “tên lớp :: tên

thành viên tĩnh” hoặc “tên ₫ối tượng Tên thành viên

thành viên tĩnh hoặc tên ₫ối tượng Tên thành viên tĩnh”

ƒ Được cấp phát bộ nhớ và khởi gán giá trị ban ₫ầu bên ợ p p ộ g g ị ngoài khai báo lớp và ngoài các hàm (kể cả hàm

main)

Trang 37

4.10 Thành viên tĩnh(…)

ƒ Xây dựng lớp HD (hóa ₫ơn) gồm 2 dữ liệu là mshd

(mã số hóa ₫ơn) và tienban với các hàm thực hiện

hứ ă

chức năng sau:

— Hàm tạo hóa ₫ơn

— Hàm hủy hóa ₫ơn y

— Hàm sửa nội dung hóa ₫ơn (sửa tiền bán)

— Hàm in ra tổng số hóa ₫ơn và tổng số tiền bán sau các thao tác tạo, hủy, sửa hóa ₫ơn.

— Viết hàm main ₫ể ứng dụng

Trang 38

void g(A a){

a.n = 10; //???

}

ƒ Làm thế nào ₫ể hàm phi thành viên, hàm thành viên của một lớp khác có thể truy nhập trực tiếp vào biến thành viên của một p y ập ự p ộ

Trang 39

friend void g(A a);

friend void B::f(A a);

friend class C;

B():m(0){}

void f(A a){ a.n = 5;}//OK

};

;

};

void g(A a){

a.n = 10; ; //OK

}

Trang 40

Date(int d, int m, int y){

day = d; month = m; year = y;

}};

tử xuất ra màn hình cho các biến cơ sở ₫ó Biến d thuộc kiểu

Date do người sử dụng ₫ịnh nghĩa.

ƒ Giải pháp: ₫ịnh nghĩa lại toán tử xuất cho lớp Date

Trang 41

ƒ Nạp chồng toán tử xuất cho lớp Date

Date(int d=1, int m=1, int y=2010){

day = d; month = m; year = y;

}

friend ostream& operator<<(ostream& os const Date& d);

friend ostream& operator<<(ostream& os, const Date& d);};

ostream& operator<<(ostream& os, const Date& d){

Trang 42

ƒ Ví dụ 2: Nạp chồng toán tử cho lớp số phức complex

ƒ Lý do tương tự như lớp Date ở trên

ƒ Lý do tương tự như lớp Date ở trên

Trang 43

Complex(int r = 0, int i =0): real(r),imag(i) {}

Complex operator+(const Complex& b) const {

Complex z(real + b.real, imag + b.imag);

return z;

}Complex operator-(const Complex& b) const {

return Complex(real - b.real, imag - b.imag);

}

Complex operator*(const Complex&) const;Complex operator/(const Complex&) const;Complex& operator +=(const Complex&);

Complex& operator -=(const Complex&);

};

Trang 44

ƒ Nạp chồng các toán tử cho lớp complex sử dụng hàm bạn

Complex(int r = 0, int i =0): real(r),imag(i) {}

friend Complex operator+(const Complex&, const Complex&) const;

friend Complex operator-(const Complex&, const Complex&) const;

friend Complex operator*(const Complex&, const Complex&) const;

Trang 45

— Toán tử truy nhập phạm vi (dấu hai chấm ₫úp) ::

— Toán tử truy nhập thành viên cấu trúc (dấu chấm)

— Toán tử gọi hàm thành viên qua con trỏ *->

Trang 46

ƒ 2 Bổ sung các yêu cầu sau vào lớp Array

— Các hàm nạp chồng toán tử [] (₫ể gán hoặc lấy giá trị của Các hàm nạp chồng toán tử [] (₫ể gán hoặc lấy giá trị của

một phần tử),

— Nạp chồng toán tử +, -, * hai array, hoặc array với một số

Ngày đăng: 27/03/2014, 12:11

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w