Professional Documents
Culture Documents
k=i*n+j
Các mở rộng của C++ (tiếp)
• Hàm inline
inline Kiểu Tên_hàm (các_tham_số)
{
//thân hàm
}
– Hàm inline phải được định nghĩa trước khi sử dụng
– Trình biên dịch chèn trực tiếp đoạn chương trình vào
chỗ hàm được gọi.
– Các hàm đệ quy không được là hàm inline
Các mở rộng của C++ (tiếp)
• Tham số giá trị mặc định
– Chỉ được khai báo trong prototype
– Phải được nhóm lại vào các tham số cuối
– Khi gọi chỉ có thể bỏ bớt từ phải sang trái và
phải liên tiếp nhau.
Các mở rộng của C++ (tiếp)
• Biến tham chiếu
– Biến tham chiếu giống như bí danh của biến
khác
– Khai báo Kiểu &Tên_biến
– Nếu không muốn thay đổi giá trị của tham số
qua biến tham chiếu thì khai báo
const kiểu &tên_biến
– Biến tham chiếu phải được khởi động khi khai
báo
Các mở rộng của C++ (tiếp)
• Chồng hàm
– Cho phép sử dụng một tên cho nhiều hàm khi
các hàm đó khác nhau về kiểu giá trị trả về
hoặc danh sách các tham số
Các giới hạn của chồng hàm
• Bất kỳ hai hàm nào trong tập các hàm đã chồng phải có
các tham số khác nhau
• Các hàm chồng với danh sách các tham số cùng kiểu
chỉ dựa trên kiểu trả về của hàm thì trình biên dịch báo
lỗi
• Các khai báo bằng lệnh typedef không định nghĩa kiểu
mới. Chúng không ảnh hưởng tới cơ chế chồng hàm.
• Đối với kiểu mảng và con trỏ được xem như đồng nhất
đối với sự phân biệt khác nhau giữa các phiên bản hàm
trong việc chồng hàm.
• const và các con trỏ (hay các tham chiếu) có thể dùng
để phân biệt
Các mở rộng của C++ (tiếp)
• Chồng toán tử
• Được xây dựng bằng cách sử dụng một đối kiểu tham
chiếu đối tượng để khởi tạo một đối tượng mới.
Tên_lớp(const Tên_lớp &Đối_tượng) {
//Các câu lệnh gán thuộc tính
}
• Hàm tạo sao chép mặc định thực hiện chức năng sao
chép nội dung từng bít của đối tượng.
• Nếu lớp không có các thuộc tính kiểu con trỏ hay tham
chiếu thì chỉ cần các hàm tạo sao chép mặc định.
Ngược lại, phải xây dựng hàm tạo sao chép
Hàm hủy – Destructor
• Hàm hủy được gọi khi giải phóng một đối tượng.
• Nếu trong lớp không định nghĩa hàm hủy thì một
hàm hủy mặc định được phát sinh
• Nếu các lớp có thành phần dữ liệu động thì cần
phải sử dụng hàm hủy.
~Tên_lớp() {
//các lệnh
}
Định nghĩa các phép toán cho lớp
~ ! = < > += -= *=
. .* :: ?: sizeof
Hàm toán tử
• Nếu hàm toán tử không là thành viên của một
lớp thường là các hàm friend.
• Hàm toán tử như một hàm thành viên
– toán hạng cực trái phải là một đối tượng lớp
• Hàm toán tử như hàm không thành viên
– toán hạng bên trái là đối tượng của lớp khác hoặc
một kiểu có sẵn.
Hàm toán tử (tiếp)
• Hàm chồng toán tử << và >>
– phải có một toán hạng trái của kiểu ostream
&, istream &
– không là hàm thành viên.
• Chồng các toán tử hai ngôi
– là hàm thành viên không tĩnh với một tham số
– hoặc như một hàm không thành viên với hai
tham số.
Hàm toán tử (tiếp)
Toán tử Ví dụ Toán tử Ví dụ Toán tử Ví dụ
+ a+b += a+=b <<= a<<=b
- a-b -= a-=b == a==b
* a*b *= a*=b != a!=b
/ a/b /= a/=b <= a<=b
% a%b %= a%=b >= a>=b
^ a^b ^= a^=b && a&&b
& a&b &= a&=b || a||b
| a|b |= a|=b , a,b
= a=b << a<<b [] a[b]
< a<b >> a>>b ->* a->*b
> a>b >>= a>>=b
Hàm toán tử (tiếp)
• Chồng các toán tử một ngôi
– như một hàm thành viên không tĩnh không có
tham số
– hoặc như một hàm không thành viên với một
tham số.
Hàm toán tử (tiếp)
Toán tử Ví dụ Toán tử Ví dụ
+ +c ~ ~c
- -c ! !a
* *c ++ ++c, c++
-> c->
Chồng một số toán tử đặc biệt
• Toán tử []
– Dùng để truy cập đến một phần tử của mảng.
– Là toán tử hai ngôi, có dạng a[b]
– Khi chồng toán tử này thì hàm toán tử tương ứng
phải là thành viên của một lớp.
• Toán tử ()
– Dùng để gọi hàm
– Gồm hai toán hạng: toán hạng đầu tiên là tên hàm,
toán hạng thứ hai là danh sách các tham số của hàm.
– Khi chồng toán tử này thì hàm toán tử tương ứng
phải là thành viên của một lớp.
Chương 4