Bài giảng Giới thiệu lập trình: Hàm nâng cao cung cấp cho người học các kiến thức: Nhắc lại hàm – cơ bản, nạp chồng hàm, nạp chồng toán tử. Đây là một tài liệu hữu ích dành cho các bạn sinh viên và những ai quan tâm dùng làm tài liệu học tập và nghiên cứu.
Trang 1Giới Thiệu Lập Trình
Hàm – Nâng Cao
TS Lê Nguyên Khôi Trường Đại học Công nghệ, ĐHQGHN
Trang 2Nội Dung
Nhắc lại Hàm – Cơ Bản
Nạp chồng hàm
Nạp chồng toán tử
Trang 3Hàm – Cơ Bản
Khai báo hàm
int bin ( int , int ) ;
Định nghĩa hàm
int bin ( int so1 , int so2 ) {
// thân hàm miêu tả định nghĩa // không khai báo lại so1 , so2 }
Chữ ký hàm
int bin ( int , int )
Lời gọi hàm
int a = bin ( so1 , so2 ) ;
Sử dụng tên hàm, tên tham số, không có kiểu
Trang 4Hàm – Cơ Bản – Truyền Tham Số
Truyền giá trị
int bin ( int , int ) ;
Tạo và truyền một bản sao > tốn chi phí
Thay đổi bản sao , bản gốc ngoài hàm không đổi
Xóa bản sao khi kết thúc hàm
Truyền tham chiếu
int bin ( int & , int & ) ;
Chính bản gốc được truyền (địa chỉ bản gốc)
Thay đổi trong hàm, bản gốc thay đổi
Không xóa bản gốc khi kết thúc hàm
Trang 5Hàm – Cơ Bản – Sử Dụng const
Truyền tham chiếu
int bin ( int & , int & ) ;
Thay đổi trong hàm, bản gốc thay đổi
Không muốn hàm thay đổi, sử dụng từ khóa const
Bảo vệ dữ liệu, không cho thay đổi, dữ liệu “chỉ-đọc”
int bin ( const int & , const int & ) ;
Quy ước:
Luôn truyền tham chiếu
Dữ liệu không thay đổi, dùng const
Dữ liệu thay đổi, không dùng const
Trang 6Hàm Nạp Chồng (Function Overloading)
Các hàm thực hiện công việc tương tự
Trùng tên, nhưng khác nhau về tham số
Số lượng tham số
Kiểu tham số
Xác định hàm nào được gọi:
Sử dụng thông tin về tham số
Số lượng & kiểu tham số
Kiểu của hàm
Trang 7Hàm Nạp Chồng – Ví Dụ
void _trungDiem ( const ToaDo & td1 ,
const ToaDo & td2 , ToaDo & trungDiem ) { trungDiem.x = ( td1.x + td2.x ) / 2;
trungDiem.y = ( td1.y + td2.y ) / 2;
}
ToaDo * _trungDiem ( const ToaDo & td1 ,
const ToaDo & td2 ) { ToaDo * trungDiem = new ToaDo;
(*trungDiem).x = ( td1.x + td2.x ) / 2;
(*trungDiem).y = ( td1.y + td2.y ) / 2;
return trungDiem;
}
Trang 8Hàm Nạp Chồng
Khác số lượng tham số
Hàm tính tổng các số truyền vào
Tính tổng 3 số nguyên
int _tong ( int , int , int ) ;
Tính tổng 2 số nguyên
int _tong ( int , int ) ;
Tính tổng 1 số nguyên
int _tong ( int ) ;
Dựa trên số lượng tham số để gọi hàm tương ứng
Trang 9Hàm Nạp Chồng
Tham số mặc định
int _tong(int so1, int so2 = 0, int so3 = 0) {
return so1 + so2 + so3;
}
Có thể gọi
_tong ( 1 , 2 , 3 ) _tong ( 1 , 2 )
_tong ( 1 )
Có định nghĩa hàm int _tong ( int , int )
_tong ( 1 , 2 ) gọi hàm nào
Trang 10Hàm Nạp Chồng
Khác kiểu tham số
Hàm tính tổng 2 số truyền vào
int _tong ( int , int ) ; double _tong ( double , double ) ;
Dựa trên kiểu tham số để gọi hàm tương ứng
Tại sao không sử dụng chuyển đổi kiểu tự động
Kiểu trả về không đúng
Nguy hiểm
_tong(1,2) gọi int _tong(int, int);
_tong(1.0,2.0) gọi double _tong(double, double);
Trang 11Hàm Nạp Chồng
Khác kiểu tham số
Hàm tính tổng 2 số truyền vào
double _tong ( int , double ) ; double _tong ( double , int ) ;
Dựa trên kiểu tham số để gọi hàm tương ứng
Sử dụng chuyển đổi kiểu tự động
_tong ( 3 , 3 ) hoặc _tong ( 3.5 , 3.5 )
Gọi hàm nào
Thêm đầy đủ
int _tong ( int , int ) ; double _tong ( double , double ) ;
Trang 12Toán Tử
Toán tử thực chất là hàm
Sử dụng toán tử giống lời gọi hàm
Viết theo một cách khác
Ví dụ: so sánh bằng
1 == 2 thực chất == ( 1 , 2 )
Trang 13Toán Tử Nạp Chồng
Giống như hàm, toán tử cũng có thể nạp chồng
Định nghĩa toán tử cho kiểu dữ liệu mới
Nạp chồng toán tử so sánh cho kiểu cấu trúc
struct PS { int ts , ms ; } ;
bool operator == ( const PS & ps1 ,
const PS & ps2 ) { return ( ps1.ts * ps2.ms
== ps2.ts * ps1.ms ) ; }
bool operator != ( const PS & ,
const PS & ) ;
Trang 14Toán Tử Nạp Chồng
struct PS { int ts , ms ; } ;
bool operator == ( const PS & ,
const PS & ) ; bool operator != ( const PS & ,
const PS & ) ; int main() {
PS ps1 , ps2 ; // nhập dữ liệu …
if ( ps1 == ps2 ) …
if ( ps1 != ps2 ) … }
Trang 15Toán Tử Nạp Chồng
struct PS { int ts , ms ; } ;
PS operator + ( const PS & ps1 ,
const PS & ps2 ) {
PS tongPS;
// cập nhật tongPS return tongPS;
}
int main() {
PS ps1 , ps2 , tongPS ; tongPS = ps1 + ps2 ;
}
Trang 16Toán Tử Nạp Chồng
struct PS { int ts , ms ; } ;
PS operator + ( const PS & ps ,
const int & i ) {
PS tongPS;
// cập nhật tongPS return tongPS;
}
int main() {
PS ps , tongPS ; tongPS = ps + 1 ; }
Trang 17Toán Tử Nạp Chồng
ostream & operator << (
ostream & outStream , const PS & ps ) {
outStream << ps.ts << "/" << ps.ms ; return outStream;
}
int main() {
PS ps , tongPS ; tongPS = ps + 1 ; cout << tongPS;
}
Trang 18Template – Giới Thiệu
int _getMax(int so1 , int so2) {
if (so1 < so2) return so2;
return so1;
}
double _getMax(double so1 , double so2) {
if (so1 < so2) return so2;
return so1;
}
PS _getMax(PS so1 , PS so2) {
if (so1 < so2) return so2;
return so1;
}
Trang 19Template – Giới Thiệu
template <class T>
T _getMax ( T so1 , T so2 ) {
if ( so1 < so2 ) return so2;
return so1;
}
int main() {
PS ps1 , ps2 , psMax;
psMax = _getMax<PS> ( ps1 , ps2 ) ; }