Truyền Giá Trị Cho Hàm Theo Biến Tham Chiếu

r->rptr=p; p->lptr=r; r=p;

}

}

}

void ht()//hiển thị các số nguyên trong danh sách

{

node *p; p=l;

while(p!=NULL)

{

cout<<p->info<<" "; p=p->rptr;

Có thể bạn quan tâm!

Xem toàn bộ 256 trang tài liệu này.

}

}

Lập trình hướng đối tượng - 3

node *tim(int x)//tìm địa chỉ nút có info = x cho trước

{

node *p; p=l;

while((p!=NULL)&&(p->info!=x)) p=p->rptr;

return p;

}

void insert(node *m,int x) //bổ sung nút có info = x vào trước nút trỏ bởi m trong ds

{

node *p; p=new node; p->info=x;

p->lptr=NULL; p->rptr=NULL;

if((r ==NULL)&&(l==NULL))l=r=p; else

if(l==m) {p->rptr=m;m->lptr=p; l=p;}

else

{


}

}


p->rptr=m;

p->lptr=m->lptr; (m->lptr)->rptr=p; m->lptr=p;

void del(int x)//xoá khỏi danh sách nút có info = x (nếu có)

{

node *p; p=tim(x); if(p!=NULL)

{

if(l==r) l=r=NULL; else

if(l==p) { l=p->rptr; l->lptr=NULL;} else

if (r==p) {r=p->lptr;r->rptr=NULL;}

else

{

(p->lptr)->rptr=p->rptr; (p->rptr)->lptr=p->lptr;

}

delete p;

}

}

void main()

{

int x,n; char tl; node *p;

cout<<"n=";cin>>n; create(n);

cout<<"Danh sach vua nhapn";

ht(); do

{

cout<<"nut tro boi m co info=";cin>>x; p=tim(x);

cout<<"bo sung x=";cin>>x; insert(p,x);

cout<<"nDanh sach sau khi bo sungn"; ht();

cout<<"loai bo x=";cin>>x; del(x);

cout<<"Danh sach sau khi loai bon"; ht();

cout<<"Tiep tuc? c/k";cin>>tl;

}

while(tl!='k'); getch();

}


1.5. Hàm trong C++


1.5.1. Biến tham chiếu

Biến tham chiếu là biến có đặc điểm:

- Không được cấp phát bộ nhớ, không có địa chỉ riêng;

- Dùng làm bí danh cho một biến nào đó và sử dụng vùng bộ nhớ của biến này.

Để khai báo biến tham chiếu ta sử dụng cú pháp:

Kiểu_dữ_liệu &Biến_tham_chiếu = Biến_được_tham_chiếu;

Trong đó, biến được tham chiếu có thể là một phần tử mảng, hoặc một biến nhớ nhưng nó phải là một biến cụ thể đã tồn tại.

Ví dụ 1.9:

float u,v, &r = u;

Trong ví dụ này, r là biến tham chiếu, biến được tham chiếu là biến u, hay r là bí danh của u. Khi đó câu lệnh: r = r +1 sẽ tăng giá trị của biến u lên 1.

1.5.2. Truyền giá trị cho hàm theo biến tham chiếu

Trong C++ khi dùng đối số là biến tham chiếu sẽ làm cho hàm thao tác trực tiếp trên vùng nhớ của các tham số do đó sẽ dễ dàng thay đổi giá trị của các tham số khi cần.

Ví dụ 1.10:

void swap(int &x, int &y)

{ int temp = x; x = y; y = temp}

Hàm swap đã sử dụng hai đối x, y là các biến tham chiếu. Khi đó, hàm có thể làm thay đổi giá trị của tham số thực được truyền cho hàm.

Việc truyền tham số cho hàm sử dụng biến tham chiếu giống như việc truyền tham số sử dụng biến nhớ thông thường khác. Ví dụ, để gọi hàm swap ta viết: swap(a, b);

1.5.3. Hàm trả về các tham chiếu

Hàm có thể trả về giá trị tham chiếu hoặc có kiểu tham chiếu. Khi đó, có thể dùng hàm để truy nhập đến một biến hoặc một phần tử mảng nào đó.

Định nghĩa của hàm có giá trị trả về là tham chiếu có dạng như sau:

<type> & fct( ...)

{

...

return <biến toàn cục>;

}

Trong trường hợp này biểu thức được trả lại trong câu lệnh return phải là tên của một biến xác định từ bên ngoài hàm, bởi vì chỉ khi đó mới có thể sử dụng được giá trị của hàm. Khi trả về một tham chiếu đến một biến cục bộ khai báo bên trong hàm, biến cục bộ này sẽ bị mất đi khi kết thúc thực hiện hàm và do vậy, tham chiếu của hàm cũng không còn có ý nghĩa nữa.

Khi giá trị trả về của hàm là tham chiếu, ta có thể gặp các câu lệnh gán “kỳ dị” trong đó vế trái là một lời gọi hàm chứ không phải là tên của một biến. Điều này hoàn toàn hợp lý, bởi lẽ bản thân hàm đó có giá trị trả về là một tham chiếu. Nói cách khác, vế trái của lệnh gán (biểu thức gán) có thể là lời gọi đến một hàm có giá trị trả về là một tham chiếu.

Ví dụ 1.11:

Khai báo một hàm f trả về tham chiếu đến một biến toàn cục z và do đó, ta có thể dùng hàm f để truy nhập đến biến z này.

#include<iostream.h>

#include<conio.h> int z;

int &f()

{

return z;

}

void main()

{

f() = 10;

f() = f() +1;

cout<<z = <<z; getch();

}


1.5.4. §èi cã gi¸ trÞ mÆc ®Þnh

§èi cã gi¸ trÞ mÆc ®Þnh lµ ®èi cã thÓ cã mÆt hoÆc kh«ng cã mÆt trong lêi gäi hµm. C¸c ®èi nµy ®•îc khëi g¸n gi¸ trÞ ngay tò khi khai b¸o nguyªn mÉu cđa hµm, chóng ph¶i lµ c¸c ®èi ®•îc khai b¸o sau cïng tÝnh tò tr¸i sang ph¶i trong danh s¸ch

®èi cđa hµm.

VÝ dô 1.12:

float Trong_luong( float m, float g = 9.8)

{ return m*g; }

Khi gäi hµm Trong_luong ta cã thÓ truyÒn cho hµm mét tham sè (Trong_luong(m)) hoÆc cã thÓ truyÒn ®đ c¶ hai tham sè (Trong_luong(m, g)). Trong tr•êng hîp chØ truyÒn mét tham sè th× hµm sÏ sö dông gi¸ trÞ 9.8 cho tham sè thø hai.


1.5.5. C¸c hµm trùc tuyÒn (inline)

Mét hµm sÏ lµ hµm trùc tuyÒn nÒu cã tò khãa inline tr•íc dßng tiªu ®Ò cđa hµm.

VÝ dô 1.13:

inline myFunction(int n);

Khi sö c¸c hµm trong mét ch•¬ng tr×nh C hoÆc C++ th•êng th× phÇn th©n hµm sau khi ®•îc biªn dÞch sÏ lµ mét tËp c¸c lÖnh m¸y. Mçi khi ch•¬ng tr×nh gäi tíi hµm, ®o¹n m· cđa hµm sÏ ®•îc n¹p vµo stack ®Ó thùc hiÖn sau ®ã tr¶ vÒ 1 gi¸ trÞ nµo ®ã nÒu cã vµ th©n hµm ®•îc lo¹i khái stack thùc hiÖn cđa ch•¬ng tr×nh. NÒu hµm ®•îc gäi 10 lÇn sÏ cã 10 lÖnh nh¶y t•¬ng øng víi 10 lÇn n¹p th©n hµm ®Ó thùc hiÖn. Víi tò kho¸ inline chóng ta muèn gîi ý cho tr×nh biªn dÞch lµ thay v× n¹p th©n hµm nh• b×nh th•êng h·y chÌn ®o¹n m· cđa hµm vµo ®óng chç mµ nã ®•îc gäi tíi trong ch•¬ng tr×nh. §iÒu nµy râ rµng lµm cho ch•¬ng tr×nh thùc hiÖn nhanh h¬n b×nh th•êng. Tuy nhiªn inline chØ lµ mét gîi ý vµ kh«ng ph¶i bao giê còng ®•îc thùc hiÖn h¬n n÷a nã lµm t¨ng kÝch bé nhí cho ch•¬ng tr×nh. Víi c¸c hµm phøc t¹p (ch¼ng h¹n nh• cã vßng lÆp) th× kh«ng nªn dïng inline mµ chØ nªn dïng víi c¸c hµm ®¬n gi¶n, ch¼ng h¹n nh• c¸c hµm chØ thùc hiÖn khëi t¹o gi¸ trÞ cho c¸c biÒn.


1.5.6. §Þnh nghÜa chång c¸c hµm

C++ cho phÐp lËp tr×nh viªn cã kh¶ n¨ng viÒt c¸c hµm cã tªn gièng nhau, kh¶ n¨ng nµy ®•îc gäi lµ chång hµm (overload). VÝ dô chóng ta cã thÓ cã c¸c hµm nh• sau:

int myFunction(int);

int myFunction(int, int);

int myFunction(int, int, int);

C¸c hµm overload cÇn tho¶ m·n mét ®iÒu kiÖn lµ danh s¸ch c¸c tham sè cđa chóng ph¶i kh¸c nhau (vÒ sè l•îng tham sè vµ hoÆc kiÓu tham sè). KiÓu c¸c hµm overload cã thÓ gièng nhau hoÆc kh¸c nhau. Danh s¸ch kiÓu c¸c tham sè cđa mét hµm ®•îc gäi lµ ch÷ ký (signature) cđa hµm ®ã.

Víi c¸c hµm lín vµ phøc t¹p chóng ta nªn sö dông chång hµm, ngoµi ra viÖc sö dông c¸c hµm chång nhau còng lµm cho ch•¬ng tr×nh s¸ng sđa vµ dÔ gì lçi h¬n.


1.5.7. §Þnh nghÜa chång c¸c to¸n tö

C++ cho phÐp thùc hiÖn c¸c phÐp to¸n (+, -, *, /,..) trªn c¸c kiÓu d÷ liÖu kh«ng ph¶i kiÓu d÷ liÖu chuÈn (®•îc gäi lµ kiÓu d÷ liÖu ng•êi dïng tù ®Þnh nghÜa). ViÖc khai b¸o c¸c hµm thùc hiÖn c¸c phÐp to¸n trªn kiÓu d÷ liÖu ng•êi dïng tù ®Þnh nghÜa ®•îc gäi lµ ®Þnh nghÜa chång to¸n tö. Khi ®ã, ta cã c¸c hµm ®•îc gäi lµ hµm to¸n tö.

C¸ch ®Þnh nghÜa hµm to¸n tö:

Tªn hµm: operator tiÒp sau lµ phÐp to¸n

VÝ dô: operator+

§èi cđa hµm to¸n tö: §èi víi to¸n tö hai ng«i hµm cÇn cã hai ®èi, ®èi víi to¸n tö mét ng«i hµm cÇn mét ®èi.

VÝ dô: Matran operator+(Matran x, Matran y) Th©n cđa hµm to¸n tö: ViÒt nh• hµm th«ng th•êng C¸ch gäi hµm to¸n tö: Cã hai c¸ch

Gäi nh• hµm th«ng th•êng. VÝ dô: z = operator+(a,b); Gäi nh• c¸ch sö dông phÐp to¸n. VÝ dô: z = x+y

VÝ dô 1.14:

#include<iostream.h>

#include<conio.h> struct Phanso

{

int tuso, mauso;

};

void Nhap(Phanso &x)

{

cout<<Tu so:; cin>>x.tuso;

do { cout<<Mau so:; cin>>x.mauso; }while (x.mauso == 0);

}

void Hienthi(Phanso x)

{

cout<<x.tuso<</<<x.mauso<<n;

}

Phanso operator+(Phanso x, Phanso y)

{

Phanso kq;

kq.tuso = x.tuso*y.mauso + y.tuso*x.mauso; kq.mauso = x.mauso*y.mauso;

return kq;

}

Phanso operator-(Phanso x, Phanso y)

{

Phanso kq;

kq.tuso = x.tuso*y.mauso - y.tuso*x.mauso; kq.mauso = x.mauso*y.mauso;

return kq;

}

Phanso operator*(Phanso x, Phanso y)

{

Phanso kq;

kq.tuso = x.tuso*y.tuso; kq.mauso = x.mauso*y.mauso; return kq;

}

Phanso operator/(Phanso x, Phanso y)

{

Phanso kq;

kq.tuso = x.tuso*y.mauso; kq.mauso = x.mauso*y.tuso; return kq;

}


void main()

{

Phanso x, y, z;

Nhap(x);

Nhap(y); z = x + y;

cout<<nTong hai phan so la:; Hienthi(z);

z = x - y;

cout<<nHieu hai phan so la:; Hienthi(z);

z = x * y;

cout<<nTich hai phan so la:; Hienthi(z);

z = x / y;

cout<<nThuong hai phan so la:;

Xem toàn bộ nội dung bài viết ᛨ

..... Xem trang tiếp theo?
⇦ Trang trước - Trang tiếp theo ⇨

Ngày đăng: 03/07/2022