Hàm tại chỗ inline Chương 3: Hàm phương thức: method và hàm đa năng trong OOP... Hàm được gọi ngay cả khi không có đối tượng nào được tạo bằng cách sử dụng toán tử phạm vi “::” Cú
Trang 1ĐH CÔNG NGHỆ THÔNG TIN http://sites.google.com/site/khaiphong
Số tiết lý thuyết: 45 tiết
Số tiết thực hành: 30 tiết
1
Trang 22
Nội dung môn học:
Trang 3 Hàm tại chỗ (inline)
Chương 3: Hàm (phương thức: method) và hàm đa năng trong OOP
Trang 4int getTuso(){return tuso;}
int getMauso(){return mauso;}
void setTuso(int tu){tuso=tu;}
void setMauso(int mau){mauso=mau;}
};
Trang 5 Phương thức này thường được quy ước đặt tên theo dạng tiền tố (get/set/is ứng với từng loại truy vấn),tiếp theo là tên của thành viên dữ liệu
Chương 3: Hàm và hàm đa năng trong OOP
Trang 6 Hàm tại chỗ (inline)
hàm đa năng trong OOP
Trang 7X(const X&); // Hàm khởi tạo sao chép
};
Trang 8 Khi một đối tượng được khởi tạo từ
một đối tượng khác của cùng lớp
Khi một đối tượng được truyền như
là một đối số cho hàm
Khi hàm trả về một đối tượng
Khi có cấp phát động thì hàm khởi tạo sao chép bắt buộc phải định nghĩa lại để tránh trường hợp con trỏ NULL (null pointer assignment)
Trang 9 Chương 3: Hàm và hàm đa năng trong OOP
c
Tuso:3 Mauso:5
b
Tuso:3 Mauso:5
Trang 10Phân số
c
Tuso:3 Mauso:5
b
Tuso:3 Mauso:5
Phanso(); // Hàm khởi tạo không đối số
Phanso(int,int); // Hàm khởi tạo 2 đối số Phanso(const Phanso&); // Hàm khởi tạo sao chép
Phanso a; // gọi hàm khởi tạo Phanso()
Phanso b(3,5); // gọi hàm khởi tạo Phanso(int,int)
Phanso c(b); // gọi hàm khởi tạo Phanso(const Phanso&);
}
Trang 11CString(); // Hàm khởi tạo không đối số
CString(char *s); // Hàm khởi tạo 1 đối số
CString(const CString&); // Hàm khởi tạo sao chép
CString s1; // gọi hàm khởi tạo CString()
CString s2(“Hello world”); // gọi hàm khởi tạo CString(char *str)
CString s3(s2); // gọi hàm khởi tạo CString(const CString&);
Trang 12 Hàm tại chỗ (inline)
hàm đa năng trong OOP
Trang 13 Ví dụ:
Chương 3: Hàm và hàm đa năng trong OOP
float divide(int a,int b=2){
return (float)a/b;
b được gán lại = 5
Trang 14Ví dụ:
int divide( int a=8, int b) // error
int divide( int a=8, int b=10) // ok
Giá trị ngầm định phải đúng với kiểu trong khai báo
Ví dụ:
int divide( int a, int b=2.5) // error
int divide( int a, in t b=2) // ok
Giá trị ngầm định chỉ khai báo một lần trong khai báo hàm hoặc trong định nghĩa hàm nhưng không thể trong cả hai
Trang 15 Hàm tại chỗ (inline)
Chương 3: Hàm (phương thức: method) và hàm đa năng trong OOP
Trang 16Hàm tĩnh: là hàm dùng để truy cập các thành viên dữ liệu tĩnh của lớp Hàm này không thuộc về một đối tượng nào của lớp Hàm được gọi ngay cả khi không có đối tượng nào được tạo bằng cách sử dụng toán tử phạm vi “::”
Cú pháp khai báo chung: dùng từ khoá static trước kiểu dữ liệu hay hàm.
Trang 17int Student::count=0; // bắt buộc phải khởi tạo
dữ liệu tĩnh trước khi sử dụng, gán =0 vì chưa
có đối tượng nào được tạo
Trang 19void Student:: printCount(){
cout<<“So doi tuong cua lop Student:”<<count<<endl;
So doi tuong cua lop Student:1
So doi tuong cua lop Student:2
So doi tuong cua lop Student:2
So doi tuong cua lop Student:1
Trang 20void Student:: printCount(){
cout<<“So doi tuong cua lop Student:”<<count<<endl;
So doi tuong cua lop Student:1
So doi tuong cua lop Student:2
So doi tuong cua lop Student:2
So doi tuong cua lop Student:0
Trang 21 Hàm tại chỗ (inline)
Chương 3: Hàm (phương thức: method) và hàm đa năng trong OOP
Trang 22Lớp bạn: khi tất cả hoặc phần lớn các hàm của một lớp (class B) cần truy xuất đến một lớp khác (class A) thì ta nên cho class
B là bạn của class A
Cú pháp khai báo chung: dùng từ khoá friend trước kiểu dữ liệu trả về của hàm hoặc trước từ khoá class
Trang 23 Ví dụ: cho biết kết quả của CT sau
Chương 3: Hàm và hàm đa năng trong OOP
Trang 24int getData_classA(Alpha a){ return A.data};
int printData_classA(Alpha a){ cout<<A.data};
};
Trang 25 Hàm bạn được gọi như các hàm truyền thống, không cần có đối tượng gọi
Nếu B là lớp lớp bạn của A thì tất cả các hàm thành viên của lớp B có quyền truy xuất đến các thành viên dữ liệu nội tại (private) của lớp A nhưng ngược lại thì không
Chương 3: Hàm và hàm đa năng trong OOP
Trang 26 Hàm tại chỗ (inline)
hàm đa năng trong OOP
Trang 27đó nhưng có danh sách các đối số khác nhau
Phân loại:
Đa năng với các kiểu dữ liệu khác nhau
Đa năng với số lượng các đối số khác nhau
Lưu ý: Hàm đa năng không xét kiểu dữ liệu trả về của các hàm
Chương 3: Hàm và hàm đa năng trong OOP
Trang 28int Display(int);
int Display(char); // Đa năng với các kiểu dữ liệu khác nhau
void Display(char,int); // Đa năng với số lượng đối số khác nhau
float Display(int); // Error: đây không phài là hàm đa năng vì đã tồn tại hàm Display(int)
…
};
Trang 29 Hàm tại chỗ (inline)
Chương 3: Hàm (phương thức: method) và hàm đa năng trong OOP
Trang 31 Đổi kiểu người dùng thành kiểu cơ bản:
Khai báo và định nghĩa một hàm chuyển đổi
như là một hàm thành viên của lớp: operator
Chuyển đổi kiểu giữa các đối tượng:
Cần nắm rõ lớp nguồn và lớp đích trong việc chuyển đổi mà ta cài đặt hàm khởi tạo chuyển đổi hay hàm chuyển đổi
Chương 3: Hàm và hàm đa năng trong OOP
Trang 32 Đổi kiểu người dùng thành kiểu cơ bản:
Khai báo và định nghĩa một hàm chuyển đổi
như là một hàm thành viên của lớp: operator
Chuyển đổi kiểu giữa các đối tượng:
Cần nắm rõ lớp nguồn và lớp đích trong việc chuyển đổi mà ta cài đặt hàm khởi tạo chuyển đổi hay hàm chuyển đổi
Trang 33 Chương 3: Hàm và hàm đa năng trong OOP
Trường hợp 2: Đổi kiểu người dùng thành kiểu cơ bản :
Trang 34Lớp đích: cài đặt hàm khởi tạo chuyển đổi kiểu
Lớp nguồn: cài đặt hàm chuyển đổi kiểu operator
Hoặc
Trang 35 Trường hợp 3: Đổi kiểu giữa các đối tượng :
class dv_ centimet{
int centimet;
public:
dv_centimet(int cm){centimet=cm;}
int getCentimet(return centimet;)
dv_met(float m){met=m;}
dv_met(dv_centimet cm) {met=(float)cm.getCentimet()/100;}
operator dv_centimet() { return dv_centimet(int(met*100));}
};
http://sites.google.com/site/khaiphong
35
Chương 3: Hàm và hàm đa năng trong OOP
Cài đặt cho lớp dv_met::
- Hàm khởi tạo chuyển đổi kiểu (giải quyết trường hợp: m=cm)
- Hàm chuyển đổi kiểu operator (giải quyết trường hợp: cm=m)
Trang 36Cơ bản -> lớp A
Lớp A -> lớp B
Lớp A -> cơ bản
Lớp nguồn: không có Lớp đích: lớp A
Lớp nguồn: lớp A Lớp đích: không có Lớp nguồn: lớp B Lớp đích: lớp A
Trang 37 Hàm tại chỗ (inline)
Chương 3: Hàm (phương thức: method) và hàm đa năng trong OOP
Trang 38Khai báo hàm inline: thêm từ khóa inline
trước kiểu dữ liệu trả về của hàm
};
Trang 39ĐH CÔNG NGHỆ THÔNG TIN http://sites.google.com/site/khaiphong
39
Trang 4040
Trang 41A class C có thể truy xuất các thành viên private của class A
B class B có thể truy xuất các thành viên private của class C
C class B có thể truy xuất các thành viên private của class A
D class A có thể truy xuất các thành viên private của class C
Trang 42void Func(const UIT& x){
UIT *a1 = new UIT(5);
Trang 43http://sites.google.com/site/khaiphong
43
Câu 3: Trong các lệnh khai báo đối tượng sau đây, lệnh nào
sẽ gọi constructor sao chép:
Trang 4646
class A {
private: int x,y;
public:
A(int x1, int y1) { x = x1; y=y1; }
void In() { cout<<x<<", "<<y; }
B Màn hình xuất ra: 10, 10
C Màn hình xuất ra: 20, 10
D Màn hình xuất ra: 20, 20
Trang 48B Màn hình xuất ra: 10, 10
C Màn hình xuất ra: 20, 10
D Màn hình xuất ra: 20, 20
Trang 5050
A Trong hàm constructor ta có thể dùng lệnh return để trả về một giá trị cho hàm
B Mỗi lớp chỉ có duy nhất một hàm destructor
C Hàm destructor không thể là một hàm ảo
D Tất cả đều sai
Trang 51ĐH CÔNG NGHỆ THÔNG TIN http://sites.google.com/site/khaiphong
51
Trang 5252
1 B Do class B là bạn của class C (Lưu ý: Hàm bạn không tính tính chất bắc cầu)
2 A Đối tượng abc khi kết thúc hàm main sẽ gọi hàm huỷ nên giá trị
cuối cùng chắc chắn phải có 9 chọn A hay D, do trong hàm
main có thực thi hàm Func (trong hàm này tạo đối tượng con trỏ
a với giá trị khởi tạo là 5 và sau đó gọi hàm huỷ đối tượng)
chọn A
3 B A: gọi phép gán “=“
B: gọi hàm khởi tạo sao chép khi thực thi lệnh Phanso y=x;
C: goi hàm khởi tạo không đối số (D: 2 đối số)
4 A Hàm khởi tạo không đối số sẽ được tạo mặc định khi cả khi
người dùng không khai báo
5 D Lưu ý: trong một lớp nếu toán tử gán “=“ chưa định nghĩa thì
CT sẽ thực hiện sao chép từng byte một từ đối tượng nguồn sang đối tượng đích
Trang 53thay đổi giá trị của thuộc tính trong lớp A
Lưu ý: Hàm In() trong lớp A là một phương thức hằng (tức hàm
chỉ được phép đọc giá trị mà không được chỉnh sửa giá trị của các thuộc tính dữ liệu trong lớp)
8 D Do x,y có phạm vi truy xuất thuộc public
10 B Hàm khởi tạo không có kiểu trả về Hàm huỷ có thể khai báo là hàm ảo