Lớp và đối tượng
CHƢƠNG 3: LỚP ĐỐI TƢỢNG (CLASS & OBJECT) Khoa Công Nghệ Thông Tin Đại học Bách khoa – Đại học Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Nội dung Lớp – Quyền truy xuất Khai báo, định nghĩa 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 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 - Thành viên tĩnh Thành viên tham chiếu Thành viên đối tƣợng lớp Mảng đối tƣợng Phạm vi lớp Cấu trúc (structure) hợp (union) Các trƣờng bit Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khái niệm lớp Lớp: kiểu liệu trừu tƣợng Đặc tả đối tƣợng TÊN LỚP Dữ liệu thành viên Tập thao tác Hàm thành viên private protected public class Classname { : DataType1 memberdata1; DataType2 memberdata2; …………… < Quyền truy xuất > : memberFunction1(); memberFunction2(); ………… }; 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 }; Đối tượng Đối tƣợng(Object): thể thuộc lớp, thực thể có thực Khai báo: ; Để truy xuất đến thành phần đối tƣợng, truy xuất giống nhƣ kiểu struct Thành viên 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 Đóng gói C++ Khái niệm đóng gói có sẵn C++ class: ta hạn chế quyền truy nhập đến thành viên đối tƣợng Sử dụng từ khố để mơ tả quyền truy nhập: private thành viên lớp đƣợc khai báo private, đƣợc truy nhập đến từ bên lớp Mặc định: thành viên class private, nhấn mạnh khái niệm đóng gói lập trình hƣớng đối tƣợng Public Các thành viên đƣợc khai báo public đƣợc truy nhập từ bên đối tƣợng mặc định thành viên struct protected friend Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Đóng gói C++ Khi sử dụng quyền nào? Theo phong cách lập trình hƣớng đối tƣợng tốt, ta giữ thành viên liệu dạng private (che dấu liệu) Các phƣơng thức thƣờng khai báo public để liên lạc đƣợc với đối tƣợng từ bên ngoài(giao diện đối tƣợng) Các phƣơng thức tiện ích đƣợc dùng phƣơng thức khác lớp nên đƣợc khai báo private Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Ví dụ: Lớp đơn giản Khai báo Lớp Định nghĩa hàm thành viê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; } Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng void main() { Point pt; pt.SetPt(10,20); pt.OffsetPt(2,2); …… Tạo đối tƣợng thuộc lớp Point Gọi hàm đối tƣợng pt.xVal = 10; // Đúng hay sai? Point pt1, pt2, pt3; ……… } Khai báo phương thức Giao diện phƣơng thức đặt định nghĩa lớp, nhƣ khai báo thành viên liệu Phần cài đặt (định nghĩa phƣơng thức) đặt định nghĩa lớp đặt 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; } Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng class Point { int xVal, yVal; public: void SetPt (int x, int y) { xVal = x; yVal = y; } void OffsetPt (int, int); }; Khai báo phương thức Hàm inline: Cải thiện tốc độ thực thi Tốn nhớ (dành cho mã lệnh) thực thi Cách 2: class Point { int xVal, yVal; Cách 1: public: void SetPt (int x, int y) { Định xVal = x; nghĩa yVal = y; bên } void OffsetPt (int x, int y) { xVal += x; lớp yVal += y; } thêm Từ khóa inline }; Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 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; } …………… 10 Thành viên tĩnh Tóm lại, ta nên khai báo: static thành viên liệu ta muốn dùng chung cho thể lớp const thành viên liệu cần giữ nguyên giá trị suốt thời gian sống thể static const thành viên liệu cần giữ nguyên giá trị tất đối tƣợng lớp Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 52 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 Phƣơng thức tĩnh không đƣợc truyền trỏ this làm tham số ẩn Không thể sửa đổi thành viên liệu từ phƣơng thức tĩnh Gọi thông qua: :: class Window { // ……… static void PaintProc () { … } // ……… }; void main() { // …………… Window::PainProc(); } Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khai báo Định nghĩa hàm thành viên tĩnh Truy xuất hàm thành viên tĩnh 53 Thành viên tĩnh Hàm thành viên tĩnh: ví dụ class MyClass { public: MyClass(); // Constructor ~MyClass(); // Destructor static void printCount();//Output current value of count private: static int count; // count }; int main() { MyClass::printCount(); There are currently instance(s) of MyClass MyClass* x = new MyClass; There are currently instance(s) of MyClass x->printCount(); There are currently instance(s) of MyClass MyClass* y = new MyClass; There are currently instance(s) of MyClass x->printCount(); There are currently instance(s) of MyClass y->printCount(); delete x; MyClass::printCount(); } Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 54 Thành viên tĩnh typedef int bool; const bool false = 0, true = 1; class CDate{ static int dayTab[13]; int day, month, year; public: CDate(int d=1, int m=1, int y=2010); static bool LeapYear(int y) {return y%400 == || y%4==0 && y%100 != 0;} static int DayOfMonth(int m, int y); static bool ValidDate(int d, int m, int y); void Input(); }; int CDate::dayTab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; CDate::CDate(int d=1, int m=1, int y=2010){ if (ValidDate(d,m,y)){day=d;month=m;year=y;} } Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 55 Thành viên tĩnh int CDate::DayOfMonth(int m, int y){ dayTab[2]= LeapYear(y)?29:28; return dayTab[m]; } bool betw(int x, int a, int b){ return x >= a && x > d >> m >> y; while (!ValidDate(d,m,y)) { cout > d >> m >> y; } day = d; month = m; year = y; } Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 56 Thành viên tham chiếu Tham chiếu liệu thành viên: class Image { int width; int height; int &widthRef; // }; Khởi tạo SAI Khai báo bình thƣờng nhƣ liệu thành viên class Image { int width; int height; int &widthRef = width; // }; Image::Image (const int w, const int h) : widthRef(width) { //…………… } Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khởi tạo ĐÚNG thông qua danh sách khởi tạo thành viên 57 Thành viên đối tượng lớp Dữ liệu thành viên có kiểu: Dữ liệu (lớp) chuẩn ngôn ngữ Lớp ngƣời dùng định nghĩa (có thể 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) {} Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khởi tạo cho liệu thành viên qua danh sách khởi tạo thành viên 58 Thành viên đối tượng lớp class Diem { double x,y; public: Diem(double xx, double yy) {x = xx; y = yy;} // }; class TamGiac { Diem A,B,C; public: void Ve() const; // }; TamGiac t; // Bao sai Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 59 Thành viên đối tượng lớp class Diem { double x,y; public: Diem(double xx, double yy) {x = xx; y = yy;} // }; class TamGiac { Diem A,B,C; public: TamGiac(double xA, double yA, double xB, double yB, double xC, double yC):A(xA,yA),(xB,yB),C(xC,yC){} void Ve() const; // }; TamGiac t(100,100,200,400,300,300); Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 60 Mảng đối tượng Sử dụng hàm xây dựng không đối số (hàm xây dựng - default constructor) VD: Point pentagon[5]; Sử dụng 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 Bách khoa Đà Nẵng 61 Mảng đối tượng Sử dụng dạng 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; int nVertices; }; Không cần biết kích thƣớc mảng // đỉnh // số đỉnh Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 62 Phạm vi lớp Thành viên lớp: Che thực thể trùng tên phạm vi // ……… int fork (void); // fork hệ thống class Process { int fork (void); // fork thành viên // }; fork thành viên che fork toàn cục phạm vi lớp Process // ……… int Process::func1 (void) { int x = fork(); // gọi fork cục int pid = ::fork(); // gọi hàm fork hệ thống // } Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 63 Phạm vi lớp Lớp toàn cục: đại đa số lớp C++ Lớp lồng nhau: lớp chứa đựng lớp Lớp cục bộ: hàm khối class Rectangle { // Lớp lồng 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 ngồi Khoa Cơng Nghệ Thơng Tin - Đại Học Bách khoa Đà Nẵng void Render (Image &i) { class ColorTable { public: ColorTable () { /* */ } AddEntry (int r, int g, int b) { /* */ } // }; ColorTable colors; // } ColorTable ct; // SAI 64 Cấu trúc hợp Cấu trúc (structure): Bắt nguồn từ ngôn ngữ C Tƣơng đƣơng với class với thuộc tính public Sử dụng nhƣ class struct Point { Point (int, int); void OffsetPt(int, int); int x, y; }; Point p = { 10, 20 }; Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng class Point { public: Point(int, int); void OffsetPt(int, int); int x, y; }; Có thể khởi tạo dạng khơng có định nghĩa hàm xây dựng 65 Cấu trúc hợp Hợp (union): Tất thành viên ánh xạ đến địa bên đối tƣợng (khơng liên tiếp) Kích thƣớc = kích thƣớc liệu lớn union Value { long double char Pair // }; class Pair { Value Value // }; integer; real; *string; list; class Object { private: enum ObjType {intObj, realObj, strObj, listObj}; ObjType type; // kiểu đối tượng Value val; // giá trị đối tượng // }; *head; *tail; Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Kích thƣớc Value bytes = sizeof(double) 66 ... chiếu Thành viên đối tƣợng lớp Mảng đối tƣợng Phạm vi lớp Cấu trúc (structure) hợp (union) Các trƣờng bit Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khái niệm lớp Lớp: kiểu liệu trừu... - Đại Học Bách khoa Đà Nẵng }; Đối tượng Đối tƣợng(Object): thể thuộc lớp, thực thể có thực Khai báo: ; Để truy xuất đến thành phần đối tƣợng, truy xuất giống nhƣ... dung Lớp – Quyền truy xuất Khai báo, định nghĩa 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ố