Các hàm nội tuyến (inline)

Một phần của tài liệu Giáo trình lập trình hướng đối tượng (Trang 29 - 37)

Việc tổ chức chơng trình thành các hàm có u điểm chơng trình đợc chia thành các đơn vị độc lập, điều này giảm đợc kích thớc chơng trình, vì mỗi đoạn chong trình thực hiện nhiệm vụ của hàm đợc thay bằng lời gọi hàm. Tuy nhiên hàm cũng có nhợc điểm là làm là chậm tốc độ thực hiện chơng trình vì phải thực hiện một số thao tác có tính thủ tục mỗi khi gọi hàm nh: cấp phát vùng nhớ cho

các tham số và biến cục bộ, truyền dữ liệu của các tham số cho các đối, giải phóng vùng nhớ trớc khi thoát khỏi hàm.

C++ cho khả năng khắc phục đợc nhợc điểm nói trên bằng cách dùng hàm nội tuyến. Để biến một hàm thành hàm nội tuyến ta viết thêm từ khóa inline vào trớc khai báo nguyên mẫu hàm.

Chú ý: Trong mọi trờng hợp, từ khóa inline phải xuất hiện trớc các lời gọi hàm thì

trình biên dịch mới biết cần xử lý hàm theo kiểu inline.

Ví dụ hàm f() trong chơng trình sau sẽ không phải là hàm nội tuyến vì inline viết sau lời gọi hàm.

Ví dụ 2.13 #include <iostream.h> #include <conio.h> void main() { int s ; s=f(5,6); cout<<s; getch(); }

inline int f(int a,int b) {

return a*b; }

Chú ý:

Chơng trình dịch các hàm inline nh tơng tự nh các macro, nghĩa là nó sẽ thay đổi lời gọi hàm bằng một đoạn chơng trình thực hiện nhiệm vụ hàm. Cách làm này sẽ tăng tốc độ chơng trình do không phải thực hiện các thao tác có tính thủ tục khi gọi hàm nhng lại làm tăng khối lợng bộ nhớ chơng trình (nhất là đối với các hàm nội tuyến có nhiều câu lệnh). Vì vậy chỉ nên dùng hàm inline đối với các hàm có nội dung đơn giản.

Không phải khi gặp từ khoá inline là chơng trình dịch nhất thiết phải xử lý hàm theo kiểu nội tuyến. Từ khoá inline chỉ là một từ khoá gợi ý cho chơng trình dịch chứ không phải là một mệnh lệnh bắt buộc.

chữ nhật.

#include <iostream.h> #include <conio.h>

inline void dtcvhcn(int a,int b,int &dt,int &cv) { dt=a*b; cv=2*(a+b); } void main() { int a[20],b[20],cv[20],dt[20],n; cout<<"\n So hinh chu nhat";

cin>>n;

for(int i=0;i<n;++i) {

cout<<"\n Nhap 2 canh cua hinh chu nhat"<<i<<":"; cin>>a[i]>>b[i]; dtcvhcn(a[i],b[i],dt[i],cv[i]); } clrscr(); for(i=0;i<n;++i) {

cout<<"\n Hinh chu nhat thu "<<i+1<<":";

cout<<"\n Do dai hai canh "<<a[i]<<"va"<<b[i]; cout<<"\n dien tich "<<dt[i];

cout<<"\n chu vi "<<cv[i]; }

getch(); }

Ví dụ 2.15 Một cách viết khác của chơng trình trong ví dụ 2.14

#include <iostream.h> #include <conio.h>

inline void dtcvhcn(int a,int b,int &dt,int &cv); void main()

{

int a[20],b[20],cv[20],dt[20],n; cout<<"\n So hinh chu nhat";

cin>>n;

for(int i=0;i<n;++i) {

cout<<"\n Nhap 2 canh cua hinh chu nhat"<<i<<":"; cin>>a[i]>>b[i]; dtcvhcn(a[i],b[i],dt[i],cv[i]); } clrscr(); for(i=0;i<n;++i) {

cout<<"\n Hinh chu nhat thu "<<i+1<<":"; (adsbygoogle = window.adsbygoogle || []).push({});

cout<<"\n Do dai hai canh "<<a[i]<<"va"<<b[i]; cout<<"\n dien tich "<<dt[i];

cout<<"\n chu vi "<<cv[i]; }

getch(); }

void dtcvhcn(int a,int b,int &dt ,int &cv) {

dt=a*b; cv=2*(a+b); }

2.11. Hàm tải bội

Các hàm tải bội là các hàm có cùng một tên và có tập đối khác nhau (về số l- ợng các đối hoặc kiểu). Khi gặp lời gọi các hàm tải bội thì trình biên dịch sẽ căn cứ vào số lợng và kiểu các tham số để gọi hàm có đúng tên và đúng các tham số t- ơng ứng.

Ví dụ 2.16 Chơng trình tìm max của một dãy số nguyên và max của một dẫy số

thực. Trong chơng trình có 6 hàm: hai hàm dùng để nhập dãy số nguyên và dãy số thực có tên chung là nhapds, bốn hàm: tính max 2 số nguyên, tính max 2 số thực, tính max của dẫy số nguyên, tính max của dẫy số thực đợc đặt chung một tên là

max.

#include <iostream.h> #include <conio.h> #include <iomanip.h>

void nhapds(int *x,int n); void nhapds(double *x,int n); int max(int x,int y);

double max(double x,double y); void nhapds(int *x,int n)

{ for(int i=0;i<n;++i) { cout<<"Phan tu "<<i<<" = "; cin>>x[i]; } }

void nhapds(double *x,int n) {

for (int i=0;i<n;i++) {

cout<<"Phan tu "<<i<<" = "; cin>>x[i];

} }

int max(int x,int y) {

return x>y?x:y; }

double max(double x,double y) {

return x>y?x:y; }

int max(int *x,int n) {

int s=x[0];

for(int i=1;i<n;++i) s=max(s,x[i]);

return s; }

double max(double *x,int n) { double s=x[0]; for(int i=1;i<n;++i) s=max(s,x[i]); return s; } void main() { int a[20],n,ni,nd,maxi; double x[20],maxd; clrscr();

cout<<"\n So phan tu nguyen n: "; cin>>ni;

cout<<"\n Nhap day so nguyen: "; nhapds(a,ni);

cout<<"\n So phan tu so thuc: "; cin>>nd; (adsbygoogle = window.adsbygoogle || []).push({});

cout<<"\n Nhap day so thuc: "; nhapds(x,nd);

maxi=max(a,ni); maxd=max(x,nd);

cout<<"\n Max day so nguyen ="<<maxi; cout<<"\n Max day so thuc="<<maxd; getch();

}

Chú ý: Nếu hai hàm trùng tên và trùng đối thì trình biên dịch không thể phân biệt

đợc. Ngay cả khi hai hàm này có cùng kiểu khác nhau thì trình biên dịch vẫn báo lỗi. Ví dụ sau xây dựng hai hàm cùng có tên là f và cùng một đối nguyên a, nhng

kiểu hàm khác nhau. Hàm thứ nhất có kiểu nguyên( trả về a*a), hàm thứ hai có kiểu void. Chơng trình sau sẽ bị thông báo lỗi khi biên dịch.

Ví dụ 2.17

#include <iostream.h> #include <conio.h> int f(int a);

void f(int a); int f(int a) { return a*a; } void f(int a) { cout<<"\n"<<a; } void main() { int b = f(5); f(b); getch(); }

Bài tập

1. Viết chơng trình thực hiện các yêu cầu sau đây:

- Nhập dữ liệu cho các sinh viên (dùng cấu trúc danh sách liên kết đơn), các thông tin của sinh viên bao gồm: mã sinh viên, họ tên, lớp, điểm trung bình.

- Chơng trình có sử dụng toán tử new và delete.

- In ra danh sách sinh viên có sắp xếp vị thứ theo điểm trung bình.

2. Viết chơng trình để sắp xếp một mảng thực hai chiều theo thứ tự tăng dần, trong chơng trình có có sử dụng toán tử new và delete.

3. Viết các hàm tải bội để tính diện tích tam giác, diện tích hình chữ nhật, diện tích hình tròn.

4. Viết chơng trình nhân hai ma trận Amxn và Bnxp , mỗi ma trân đợc cấp phát động và các giá trị của chúng phát sinh ngẫu nhiên.

CHơNG 3

LớP

Chơng này trình bày những vấn đề sau đây:

Định nghĩa lớpTạo lập đối tợngTruy nhập đến các thành phần của lớpCon trỏ đối tợngCon trỏ thisHàm bạnDữ liệu thành phần tĩnh, hàm thành phần tĩnhHàm tạo, hàm hủyHàm tạo sao chép

Lớp là khái niệm trung tâm của lập trình hớng đối tợng, nó là sự mở rộng của các khái niệm cấu trúc (struct) của C. Ngoài các thành phần dữ liệu, lớp còn chứa các thành phần hàm, còn gọi là phơng thức (method) hoặc hàm thành viên (member function). Lớp có thể xem nh một kiểu dữ liệu các biến, mảng đối tợng. Từ một lớp đã định nghĩa, có thể tạo ra nhiều đối tợng khác nhau, mỗi đối tợng có vùng nhớ riêng.

Chơng này sẽ trình bày cách định nghĩa lớp, cách xây dựng phơng thức, giải thích về phạm vi truy nhập, sử dụng các thành phần của lớp, cách khai báo biến, mảng cấu trúc, lời gọi tới các phơng thức .

Một phần của tài liệu Giáo trình lập trình hướng đối tượng (Trang 29 - 37)