Lớp Và đối Tượng - Toán Tử Phạm Vi - Tài Liệu Text - 123doc
Có thể bạn quan tâm
- Trang chủ >>
- Công Nghệ Thông Tin >>
- Kỹ thuật lập trình
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 (3.24 MB, 45 trang )
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng22Toá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ẵng23Hà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ệnclass 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ẵng24Hà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ềmdẻohơnKhông cầnphải nhớgọi hàmEmptySet()khi khởi tạoKhoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng25Hà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.Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng26Copy constructor Copy constructor là constructor đặc biệt đƣợc gọi khi ta tạo đối tƣợng mới là bản sao của một đối tƣợng đã có sẵnMyClass x(5);MyClass y = x; hoặc MyClass y(x); C++ cung cấp sẵn một copy constructor, nó chỉ đơn giản copy từng thành viên dữ liệu từ đối tƣợng cũ sang đối tƣợng mới. Tuy nhiên, trong nhiều trƣờng hợp, ta cần thực hiện các công việc Khởi tạo khác trong copy constructor Thí dụ: lấy giá trị cho một ID duy nhất từ đâu đó, hoặc thực hiện sao chép “sâu” (chẳng hạn khi một trong các thành viên là con trỏ giữ bộ nhớ cấp phát động) Trong trƣờng hợp đó, ta có thể định nghĩa lại copy constructorKhoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng27Copy constructor Khai báo cho copy constructor của lớp Foo:Foo(const Foo& existingFoo);từ khoá const đƣợc dùng để đảm bảo đốitƣợng đƣợc sao chép sẽ không bị sửa đổitham số là đối tƣợngđƣợc sao chépKiểu tham số là tham chiếuđến đối tƣợng kiểu FooKhoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng28Hàm hủy (Destructor) Dọn dẹp 1 đối tƣợng trước khi nó đƣợc thu hồi. Destructor không có giá trị trả về, và không thể định nghĩa lại (nó không bao giờ có tham số) mỗi lớp chỉ có 1 destructor 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ỏ. nếu ta không cung cấp destructor, C++ sẽ tự sinh một destructor rỗng(không làm gì cả)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ầnhàm hủy đƣợc gọi ?Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng29Bạn (Friend) – Đặt vấn đềclass IntSet {public: //...void SetToReal (RealSet&);private:int elems[maxCard];int card;};class RealSet {public: //...private:float elems[maxCard];int card;};Tập CácSố NguyênTập CácSố Thựcvoid 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ểntập số nguyên thành tập số thựcLàm thế nào để thực hiện đƣợc việc truy xuất đến thành viên Private ?Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng30Hà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: //...void SetToReal (RealSet&);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 IntSetThêm dòng khai báo Friend cho hàm thành viên SetToRealKhoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng31Hà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ậplà bạn(friend) của cả 2 lớp.Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng32Bạ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;};Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng33friend – khai báo forward Một điều cần phải chú ý khi khai báo phƣơng thức đơn lẻ là friend: Nhớ lại cách ta đã khai báo phƣơng thức SetToReal(RealSet&) là friend của RealSetclass RealSet {public: friend void IntSet::SetToReal (RealSet&);private:…}; Khi xử lý phần này, trình biên dịch cần phải biết là đã có lớp IntSet Tuy nhiên các phƣơng thức của IntSet lại dùng đến RealSet nên phải có lớp RealSet trƣớc khi định nghĩa IntSet Cho nên ta không thể tạo IntSet khi chƣa tạo RealSet và không thể tạo RealSet khi chƣa tạo IntSetKhoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng34friend – khai báo forward Giải pháp: sử dụng khai báo forward (forward declaration) cho lớp cấp quan hệ friend (trong ví dụ là RealSet) Ta khai báo các lớp trong ví dụ nhƣ sau:Class RealSet; // Forward declarationclass IntSet {public: void SetToReal (RealSet&);private:…};class RealSet {public: friend void IntSet::SetToReal (RealSet&);private:…};Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng35friend – khai báo forward Tuy nhiên, không thể làm ngƣợc lại (khai báo forward cho lớp IntSet)class IntSet; // Forward declarationclass RealSet {public: friend void IntSet::SetToReal (RealSet&);private:…}; class IntSet {public: void SetToReal (RealSet&);private:…};Trình biên dịch chƣa biết SetToRealKhoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng36friend – khai báo forward Lý do: trình biên dịch phải nhìn thấy khai báo phƣơng thức trong lớp nhận trƣớc khi tạo mối quan hệ friend tại lớp cho (granting class) Trong ví dụ, trình biên dịch phải biết khai báo IntSet::SetToReal(RealSet&) tại khai báo của IntSet trƣớc khi có thể tạo mối quan hệ friend của IntSet::SetToReal (RealSet&) với RealSet Khai báo forward cho một lớp chỉ cho trình biên dịch biết về sự có mặt của lớp mà không cho biết về các thành viên của lớp đó Vậy: cần khai báo forward cho lớp cấp quyền friend trong ví dụ trên là RealSetKhoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng37friend – Ví dụ Khai báo hàm nhân ma trận với vectoconst int N = 4;class Vector{double a[N];public:double Get(int i) const {return a[i];}void Set(int i, double x) {a[i] = x;}};class Matrix{double a[N][N];public:double Get(int i, int j) const {return a[i][j];}void Set(int i, int j, double x) {a[i][j] = x;}//...};Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng38friend – Ví dụ Khai báo hàm nhân ma trận với vecto không dùng hàm bạnVector Multiply(const Matrix &m, const Vector &v){Vector r;for (int i = 0; i < N; i++){r.Set(i, 0);for (int j = 0; j < N; j++)r.Set(i, r.Get(i)+ m.Get(i,j)*v.Get(j));}return r;}Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng39friend – Ví dụ Khai báo hàm nhân ma trận với vecto có dùng hàm bạnconst int N = 4;class Matrix; // khai báo forwardclass Vector {double a[N];public:double Get(int i) const {return a[i];}void Set(int i, double x) {a[i] = x;}friend Vector Multiply(const Matrix &m, const Vector &v);};class Matrix {double a[N][N];public:double Get(int i, int j) const {return a[i][j];}void Set(int i, int j, double x) {a[i][j] = x;}friend Vector Multiply(const Matrix &m, const Vector &v);};
Tài liệu liên quan
- Lớp và đối tượng
- 66
- 790
- 1
- Hướng đối tượng - Lớp và đối tượng
- 20
- 447
- 0
- Bài giảng C - Lớp và đối tượng
- 6
- 552
- 3
- Bài giảng C - lớp và đối tượng - p2
- 12
- 389
- 1
- Chương III. Lớp và đối tượng
- 61
- 358
- 2
- Lớp và đồi tượng
- 46
- 347
- 1
- Lớp va đối tượng
- 46
- 342
- 0
- Giới thiệu lập trình hướng đối tượng, lớp và đối tượng
- 36
- 629
- 1
- Lớp và đối tượng - Toán tử phạm vi
- 45
- 674
- 3
- LỚP VÀ ĐỐI TƯỢNG
- 46
- 314
- 0
Tài liệu bạn tìm kiếm đã sẵn sàng tải về
(3.24 MB - 45 trang) - Lớp và đối tượng - Toán tử phạm vi Tải bản đầy đủ ngay ×Từ khóa » Toán Tử Dùng để
-
Toán Tử :: Trong C++ Dùng để Làm Gì - Programming - Dạy Nhau Học
-
Bảng Toán Tử - Microsoft Support
-
Toán Tử Trong C++, Khái Niệm Và Ví Dụ Minh Họa - Thủ Thuật
-
Toán Tử – Wikipedia Tiếng Việt
-
10 Từ Khóa Không Thể Không Biết Trong C++ OOP - CodeLearn
-
Review Toán Tử Là Gì? Các Toán Tử Trong C, C++ Thường Gặp
-
Nạp Chồng Toán Tử Trong C++ | TopDev
-
Toán Tử Trong SQL
-
Toán Tử Trong C++
-
Các Toán Tử Trong C++ - Freetuts
-
Toán Tử Trong C++
-
Bài 8: Cách Sử Dụng Toán Tử Trong Lập Trình C - Khuê Nguyễn
-
So Sánh Các Toán Tử Is, Is Not Với (==), (!=) - Viblo
-
Các Toán Tử Trong Tính Toán Và Mức độ ưu Tiên Trong Excel Cực Chi Tiết
-
2.4. Ghi đè Các Phép Toán - Lập Trình Tân Binh
-
[PDF] Chương 8. Tái định Nghĩa
-
Toán Tử Trong C++ - Học Lập Trình C++ Online - Viettuts
-
Cú Pháp Và Cách Sử Dụng Toán Tử điều Kiện Trong C++ - Góc Học IT
-
Bài 4: Toán Tử Và Biểu Thức Trong C | Tìm ở đây