Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 21 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
21
Dung lượng
113,98 KB
Nội dung
1/21
Bài 12
CÁC KHÁINIỆMNÂNGCAO
VỀ CLASS
Hàm friend
2/21
Để một hàm không phải thành viên truy xuất được
các thành viên riêng của lớp phải khai báo bằng từ
khóa friend.
Cần khai báo prototype của hàm bạn trong phần
public của class. Ví dụ
class cl {
//
public:
friend void frnd(cl ob);
//
};
3/21
class myclass {
int a, b;
public:
myclass(int i, int j) { a=i; b=j; }
friend int sum(myclass x); // sum() is a friend of myclass
};
int sum(myclass x)
{
return x.a + x.b;
}
int main()
{
myclass n(3, 4);
cout << sum(n);
return 0;
}
Ví dụ
Quá tải constructor
4/21
Dùng hàm tạo ở những dạng khác.
Để quá tải hàm tạo chỉ việc khai báo dạng mà nó
nhận và định nghĩa mỗi hành động liên hệ với
những dạng này.
Ví dụ
5/21
#include <ctime>
class timer{
int seconds;
public:
// seconds specified as a string
timer(char *t) { seconds = atoi(t); }
// seconds specified as integer
timer(int t) { seconds = t; }
// time specified in minutes and seconds
timer(int min, int sec) { seconds = min*60 + sec; }
void run();
} ;
void timer::run()
{
clock_t t1;
t1 = clock();
while((clock()/CLOCKS_PER_SEC - t1/CLOCKS_PER_SEC) <
seconds);
cout << "\a"; // ring the bell
}
int main()
{
timer a(10), b("20"), c(1, 10);
a.run(); // count 10 seconds
b.run(); // count 20 seconds
c.run(); // count 1 minute, 10 seconds
return 0;
}
Từ khóa this
6/21
Mỗi khi một hàm thành viên được gọi nó được
truyền một con trỏ chỉ đến đối tượng gọi hàm.
Con trỏ this là một tham số không tường minh đối
với tất cả các hàm thành viên, vì vậy trong hàm
thành viên this có thể được dùng để tham chiếu đến
đối tượng gọi nó.
class cl {
int i;
void f() { };
//
};
Bên trong f( ), câu lệnh gán cho i giá trị 10:
i = 10;
Thực ra câu lệnh trên là viết tắt của :
this->i = 10;
7/21
#include <iostream>
using namespace std;
class cl {
int i;
public:
void load_i(int val) { this->i = val; } // same as i = val
int get_i() { return this->i; } // same as return i
} ;
int main()
{
cl o;
o.load_i(100);
cout << o.get_i();
return 0;
}
Quá tải toán tử
8/21
C++ cho phép quá tải toán tử liên hệ với các kiểu class.
Quá tải toán tử cho phép định nghĩa ý nghĩa của một
toán tử cho một class đặc biệt.
Ví dụ một class định nghĩa một danh sách liên kết có
thể dùng toán tử + để thêm một đối tượng vào danh
sách.
Quá tải một toán tử chỉ đơn giản là định nghĩa một toán
tử mới liên hệ với một class mà không làm thay đổi ý
nghĩa gốc của một toán tử.
9/21
Để quá tải một toán tử cần định nghĩa ý nghĩa
nào của toán tử liên hệ với class. Tạo một hàm
operator, định nghĩa hành vi của toán tử
Dạng tổng quát
Kiểu Tên lớp::operator Toán tử(Danh sách
tham số)
{
Hành vi liên hệ với class
}
10/21
#include <iostream>
using namespace std;
class three_d {
int x, y, z; // 3-D coordinates
public:
three_d() { x = y = z = 0; }
three_d(int i, int j, int k) {x = i; y = j; z = k; }
three_d operator+(three_d op2); // op1 ẩn
three_d operator=(three_d op2); // op1ẩn
void show() ;
};
// Quá tải +.
three_d three_d::operator+(three_d op2)
{
three_d temp;
temp.x = x + op2.x; //x chính là this->x
temp.y = y + op2.y;
temp.z = z + op2.z;
return temp;
}
// Quá tải phép gán.
three_d three_d::operator=(three_d op2)
{
x = op2.x;
y = op2.y;
z = op2.z;
return *this;//trả về đối tượng được trỏ bởi this
}
void three_d::show()
{
cout << x << ", ";
cout << y << ", ";
cout << z << "\n";
}
[...]... a k C++ h tr tính th a k b ng cách cho phép m t class h p nh t v i class khác trong khai báo Khai báo: class Tên class nh n th a k : Tên class cho th a k { Thân class nh n th a k } 12/ 21 class xe { int banh; int nguoi; public: void set_banh(int num) { banh = num; } int get_banh() { return banh; } void set_ng(int num) { nguoi = num; } int get_ng() { return nguoi; } }; class xe_tai : public xe { int... } }; 19/21 { B _class *p; B _class B_ob; D _class *dp; D _class D_ob; p = &B_ob; // địa chỉ của base // truy xuất B _class qua pointer p->put_author("Tom Clancy"); // truy xuất D _class qua base pointer p = &D_ob; p->put_author("William Shakespeare"); // Mỗi author vào một đối tượng thích hợp B_ob.show_author(); D_ob.show_author(); cout put_title("The Tempest"); p->show_author();... quá trình trong đó các hi n th c khác nhau c a hàm có th đư c truy xu t qua cùng m t tên "M t giao ti p, Đa phương th c" Các con tr ch đ n các ki u th a k Con tr l p cơ s và con tr l p th a k đư c liên h v i nhau 18/21 class B _class { char author[80]; public: void put_author(char *s) { strcpy(author, s); } void show_author() { cout . 1/21
Bài 12
CÁC KHÁI NIỆM NÂNG CAO
VỀ CLASS
Hàm friend
2/21
Để một hàm không phải thành viên truy xuất được
các thành viên riêng của. kế
12/ 21
C++ hỗ trợ tính thừa kế bằng cách cho phép một
class hợp nhất với class khác trong khai báo.
Khai báo:
class Tên class nhận thừa kế : Tên class