Chapter4 Class trong c++

46 323 3
Chapter4 Class trong c++

Đ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

Class trong c++

Nội dung  4.1 Khái niệm  4.2 Định nghĩa lớp 43Bế thà h ê  4 . 3 B i ế n thà n h vi ê n  4.4 Hàm thành viên  4.5 Kiểm soát tru y nhậ p y p  4.6 Bài tập phần 1  4.7 Hàm tạo và hàm hủy  48Hàmtạobảnsao  4 . 8 Hàm tạo bản sao  4.9 Hàm toán tử gán  4.10 Thành viên tĩnh  4.11 Nạp chồng toán t ử  4.12 Khai báo friend Chương 4: Lớp và đối tượng © 2010 - KimThoa 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ý: Pdll  P erson, stu d ent, emp l oyee, emp l oyer  Car, bus, vehicle,… — Đối tượng logic  Trend, report, button, window,…  Một ₫ối tượng có: — Các thuộctính Các thuộc tính —Trạng thái — Hành vi C ớ — C ăn cư ớ c —Ngữ nghĩa Chương 4: Lớp và đối tượng © 2010 - KimThoa 3 Lớp là gì?  Là sự thực thi của các ₫ối tượng có chung các thuộc tính, hành vi, quan hệ, ngữ nghĩa.  Lớp là một kiểu dữ liệu mới có cấu trúc, trong ₫ó việc truy nhập các biến thành viên ₫ược kiểm soát thông qua các hàm thành viên. qua các hàm thành viên.  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 Chương 4: Lớp và đối tượng © 2010 - KimThoa 4 4.2 Định nghĩa lớp  Kiểu dữ liệu có cấu trúc sruct Date{ int day month year; //sử dụng void main() { int day , month , year; }; void set_date(Date& date,int d, int m, int y){ date.day = d; date.month = m; { Date d; set_date(d,32,13,2010); add_day(d,5); add_year(d,1); d month = 13; date.year = y; } void add_day(Date& date, int n){ date.day += n; d . month = 13; } } void add_month(Date& date, int n) ){ date.month += n; } Truy nhập biến thành viên từ bên ngoài } void add_year(Date& date, int n) ){ date.year += n; } Chương 4: Lớp và đối tượng © 2010 - KimThoa 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 dụng —Ví dụ: thay ₫ổi lại cấu trúc Date sruct Date{ int d, m, y; }; —Thì ₫oạn mã sau sẽ có lỗi không biên dịch Date d; d th 10 d .mon th = 10 ; Chương 4: Lớp và đối tượng © 2010 - KimThoa 6 Lớp hóa  Định nghĩa lớp Date class Date{ it d Tên lớp Biến thành viên i n t d ay; int month; int year; public: void set date ( int d , int m , int y){ Biến thành viên Kiểm soát quyền truy nhập _ ( , , y){ day = d; month = m; year = y; } int get day() { return day; } 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 } }; Chương 4: Lớp và đối tượng © 2010 - KimThoa 7  Sử dụng lớp Date void main(){ Dt d Đối tượng D a t e d ; d.set_date(1,1,2010); d.add_year(10); d.day = 10; //?? d.month = 10 ; // ?? Có lỗi. day month year là ;// 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 thậ từ bê int year = d . get _ year(); } t ruy n hậ p từ bê n ngoài (kiểu private) Chương 4: Lớp và đối tượng © 2010 - KimThoa 8  Tha y ₫ổi tên biến thành viên của lớ p y p class Date{ it d //Sử dụng void main{ i n t d ; int m; int y; public: void set date ( int d , int m , int y){ void main{ Date d; d.set_date(1,1,2010); d.add_year(10); int day = d.get_day(); _ ( _, _, _y){ d = _d; m = _m; y = _y; } int get day() { return d; } 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) ){ year += n; Có sự khác biệt } }; biệt không? Chương 4: Lớp và đối tượng © 2010 - KimThoa 9 4.3 Biến thành viên  Khai báo biến thành viên của lớp class Date{ int da y, month , y ear ; / /khai báo tưn g t ự như cấu trúc y, , y ; g ự };  Mặc ₫ịnh các biến thành viên không truy nhập ₫ượctừ bên Mặc ₫ịnh các biến thành viên không truy nhập ₫ược từ bên ngoài Date d; 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ấudữ liệu vậy vì không còn che giấu dữ liệu class Date{ public: int da y, month , y ear ; / /tru y nh ập ₫ư ợ c từ bên n g oài Chương 4: Lớp và đối tượng © 2010 - KimThoa 10 y, , y ; y ập ợ g };  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; } Hàm thành viên ₫ể thậ biế int get _ day() { return day; } void set_day(int d){ day = d; } }; ₫ể t ruy n hậ p biế n thành viên  Khởitạobiế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; p ublic: p Date(int d, int m, int y){ // hàm tạo day = d; month = m; year = y; } }; Chương 4: Lớp và đối tượng © 2010 - KimThoa 11 [...]... hàm thành viên class Date{ y, ,y ; int day, month,year; public: int get_day() { return day; void set_day(int d); }; void Date::set_day(int d){ day = d; } } Khai báo và ₫ịnh nghĩa Chỉ khai báo báo, không ₫ịnh nghĩa Định hĩ bên Đị h nghĩa 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 hiện báo trong tập tin ₫ầu (*.h), phần ₫ịnh nghĩa ₫ược thực hiện trong tệp tin... tệ tin khô cần tệp ti nguồn (* ồ (*.cpp) ) Chương 4: Lớp và đối tượng © 2010 - KimThoa 12 Khai báo hàm thành viên trong tệp tin ₫ầu ( h) (* h) //tệp tin Date.h class Date{ int day, month,year; public: int get_day(); void set day(int d); set_day(int }; Định hà thà h Đ h hàm thành viên trong t tin nguồn (*.cpp) t tệp t ồ (* ) //tệp tin Date.cpp void Date::set_day(int d){ y( ){ day = d; } void Date::get_day(){... truy nhập ₫ược từ lớp dẫn xuất Lớp dẫn xuất p class A{ protected: int a; void f(); }; Chương 4: Lớp và đối tượng class B: public A{ public: void g(){ f(); } }; Lớp cơ sở © 2010 - KimThoa 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... ( ; ; ) data[i] = a.data[i]; } 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 Chương 4: Lớp và đối tượng © 2010 - KimThoa 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... sẽ có: a1.n = a.n a1.data = a.data a1.data và a.data cùng trỏ vào một vùng nhớ → kết quả tương tự với trong trường hợp hàm tạo bản sao ở trên trên Trong trường hợp này cần ₫ịnh nghĩa hàm toán tử gán Chương 4: Lớp và đối tượng © 2010 - KimThoa 31 4.9 Hàm toán tử gán(…) Cú pháp chuẩn hàm toán tử gán: class A{ public: A& operator=(const A&); }; //khái báo hàm toán tử gán //₫ịnh nghĩa hàm toán tử gán:... cứu ví dụ 1: class A{ int i t a, b b; public: A(int _a, int _b):a(_a), b(_b){} //hàm tạo }; Gọi hàm toán tử gán (=) void main(){ ở ₫ây sẽ có: A a(1,2); b.a = a.a OK A b b; b.b = a.b b = a; } 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) Chương 4: Lớp và đối tượng © 2010 - KimThoa 30 4.9 Hàm toán tử gán(…) Nghiên cứu ví dụ 2: class Array{... sau khi thực hiện xong lệnh return trong hàm f © 2010 - KimThoa 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 class Array{ int n; int *data; public:... của một phần tử nào ₫ó trong Array — Viết chương trình chính minh họa cách sử dụng Chương 4: Lớp và đối tượng © 2010 - KimThoa 34 4.10 Thành viên tĩnh Biến thành viên tĩnh Vấn ₫ề: Yêu cầu ghi lại số lượng các ₫ối tượng ₫ược tạo ra từ lớp Date void main(){ id i (){ Date d1(1,1,2010); // count++ Date d2 = d1; // count++ … } Giải pháp: ₫ưa biến count là một biến static của lớp Date class Date{ int day,... ngoài khai báo KimThoa các hàm © 2010 - lớp và ngoài 35 4.10 Thành viên tĩnh(…) Hàm thành viên tĩnh class A{ int n; static int count; public: A():n(0){} void f(); static void g(); }; int A:: count = 0; void A::f(){ n++; } void A::g(){ n = 2; //??? f(x); //??? count = 2; //OK } Chương 4: Lớp và đối tượng 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 được các hà thà h... sinh, hà gan ngày sinh Hàm lấy gà i h hàm g gà i h — Viết chương trình chính minh họa cách sử dụng Chương 4: Lớp và đối tượng © 2010 - KimThoa 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; day, month,year; public: int get_day() { return day; void set_day(int d){ day = d; }; void main(){ Date d; int i = d.get_date(); } } } Câu hỏi: d.day = ? d.month = ? d.year . ngu ồ n (* .cpp )  Khai báo hàm thành viên trong tệptin₫ầu( * h)  Khai báo hàm thành viên trong tệp tin ₫ầu ( . h) //tệp tin Date.h class Date{ int day, month,year; public: int. 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ử. nhập ₫ược từ bên ngoài, nhưng truy nhập ₫ược từ lớp dẫn xuất Lớ p dẫn xuất class A{ protected: int a; class B: public A{ public: void g(){ p Lớpcơ sở void f(); }; void g(){ f(); } }; Lớp

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

Tài liệu cùng người dùng

Tài liệu liên quan