Siêu thị PDFTải ngay đi em, trời tối mất

Thư viện tri thức trực tuyến

Kho tài liệu với 50,000+ tài liệu học thuật

© 2023 Siêu thị PDF - Kho tài liệu học thuật hàng đầu Việt Nam

Các Hàm trong C
MIỄN PHÍ
Số trang
30
Kích thước
194.3 KB
Định dạng
PDF
Lượt xem
1303

Các Hàm trong C

Nội dung xem thử

Mô tả chi tiết

chương 2

Hàm trong C++

Chương này trình bầy những khả năng mới của C++ trong việc xây

dựng và sử dụng hàm. Đó là:

+ Kiểu tham chiếu và việc truyền dữ liệu cho hàm bằng tham

chiếu.

+ Đối tham chiếu hằng (const)

+ Đối có giá trị mặc định

+ Hàm trực tuyến

+ Việc định nghĩa chồng các hàm

+ Việc định nghĩa chồng các toán tử

§ 1. Biến tham chiếu (Reference variable)

1.1. Hai loại biến dùng trong C

Trước khi nói đến biến tham chiếu, chúng ta nhắc lại 2 loại biến

gặp trong C là:

Biến giá trị dùng để chứa dữ liệu (nguyên, thực, ký tự, ... )

Biến con trỏ dùng để chứa địa chỉ

Các biến này đều được cung cấp bộ nhớ và có địa chỉ. Ví dụ câu

lệnh khai báo:

double x , *px;

sẽ tạo ra biến giá trị kiểu double x và biến con trỏ kiểu double px.

Biến x có vùng nhớ 8 byte, biến px có vùng nhớ 4 byte (nếu dùng mô

hình Large). Biến x dùng để chứa giá trị kiểu double, ví dụ lệnh gán:

x = 3.14;

sẽ chứa giá trị 3.14 vào biễn x. Biến px dùng để chứa địa chỉ của một

biến thực, ví dụ câu lệnh:

px = &x ;

sẽ lưu trữ địa chỉ của biễn x vào con trỏ px.

1.2. Biến tham chiếu

Trong C++ cho phép sử dụng loại biến thứ ba là biến tham chiếu.

So với 2 loại biến quen biết nói trên, thì biến này có những đặc điểm

sau:

+ Biến tham chiếu không được cấp phát bộ nhớ, không có địa chỉ

riêng.

+ Nó dùng làm bí danh cho một biến (kiểu giá trị) nào đó và nó sử

dụng vùng nhớ của biến này. Ví dụ câu lệnh:

float u, v, &r = u ;

tạo ra các biến thực u, v và biến tham chiếu thực r. Biến r không được

cấp phát bộ nhớ, nó là một tên khác (bí danh) của u và nó dùng chung

vùng nhớ của biến u.

Thuật ngữ: Khi r là bí danh (alias) của u thì ta nói r tham chiếu

đến biến u. Như vậy 2 thuật ngữ trên được hiểu như nhau.

ý nghĩa: Khi r là bí danh của u thì r dùng chung vùng nhớ của u,

dó đó :

+ Trong mọi câu lệnh, viết u hay viết r đều có ý nghĩa như nhau, vì

đều truy nhập đến cùng một vùng nhớ.

+ Có thể dùng biến tham chiếu để truy nhập đến một biến kiểu giá

trị.

Ví dụ:

int u, v, &r = u;

r = 10 ; // u=10

cout << u ; // in ra số 10

r++ ; // u = 11

++ u ; // r = 12

cout << r ; // in ra số 12

v = r ; // v=12

36 37

& r ; // Cho địa chỉ của u

Công dụng: Biến tham chiếu thường được sử dụng làm đối của

hàm để cho phép hàm truy nhập đến các tham số biến trong lời gọi

hàm.

Vài chú ý về biến tham chiếu:

a. Vì biến tham chiếu không có địa chỉ riêng, nó chỉ là bí danh của

một biến kiểu giá trị nên trong khai báo phải chỉ rõ nó tham chiếu đến

biến nào. Ví dụ nếu khai báo:

double &x ;

thì Trình biên dịch sẽ báo lỗi:

Reference variable ‘x’ must be initialized

b. Biến tham chiếu có thể tham chiếu đến một phần tử mảng, ví dụ:

int a[10] , &r = a[5];

r = 25 ; // a[5] = 25

c. Không cho phép khai báo mảng tham chiếu

d. Biến tham chiếu có thể tham chiếu đến một hằng. Khi đó nó sẽ

sử dụng vùng nhớ của hằng và nó có thể làm thay đổi giá trị chứa

trong vùng nhớ này.

Ví dụ nếu khai báo:

int &s = 23 ;

thì Trình biên dịch đưa ra cảnh báo (warning):

Temporary used to initialize 's'

Tuy nhiên chương trình vẫn làm việc. Các câu lệnh dưới đây vẫn

thực hiện và cho kết quả như sau:

s++;

cout << "\ns= " << s; // In ra s=24

Chương trình dưới đây minh hoạ cách dùng biến tham chiếu đến

một phần tử mảng cấu trúc để nhập dữ liệu và thực hiện các phép tính

trên các trường của phần tử mảng cấu trúc.

#include <iostream.h>

#include <conio.h>

struct TS

{

char ht[25];

float t,l,h,td;

} ;

void main()

{

TS ts[10],&h=ts[1]; // h tham chiếu đến ts[1]

cout << "\n Ho ten: " ;

cin.get(h.ht,25) ;

cout << "Cac diem toan, ly, hoa: ";

cin >> h.t >> h.l >> h.h ;

h.td = h.t + h.l + h.h ;

cout << "\n Ho ten: " << ts[1].ht;

cout << "\n Tong diem: " << ts[1].td;

getch();

}

1.3. Hằng tham chiếu (const)

Hằng tham chiếu được khai báo theo mẫu:

int n = 10 ;

const int &r = n;

Cũng giống như biến tham chiếu, hằng tham chiếu có thể tham

chiếu đến một biến hoặc một hằng. Ví dụ:

int n = 10 ;

const int &r = n ; // Hằng tham chiếu r tham chiếu đến biến n

const int &s=123 ; //Hằng tham chiếu s tham chiếu đến hằng 123

38 39

Sự khác nhau giữa biến và hằng tham chiếu ở chỗ: Không cho

phép dùng hằng tham chiếu để làm thay đổi giá trị của vùng nhớ mà

nó tham chiếu.

Ví dụ:

int y = 12, z ;

const int &py=y; // Hằng tham chiếu py tham chiếu đến biến y

y++; // Đúng

z = 2*py ; // Đúng z = 26

cout << y <<" "<< py; // In ra: 13 13

py=py+1; // Sai, Trình biên dịch thông báo lỗi:

// Cannot modify a const object

Cách dùng: Hằng tham chiếu cho phép sử dụng giá trị chứa trong

một vùng nhớ, nhưng không cho phép thay đổi giá trị này.

Hằng tham chiếu thường được sử dụng làm đối của hàm để cho

phép hàm sử dụng giá trị của các tham số trong lời gọi hàm, nhưng

tránh không làm thay đổi giá trị của các tham số.

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

2.1. Hàm trong C

Trong C chỉ có một cách truyền dữ liệu cho hàm theo giá trị :

+ Cấp phát vùng nhớ cho các đối.

+ Gán giá trị các tham số trong lời gọi hàm cho các đối sau đó hàm

làm việc trên vùng nhớ của các đối chứ không liên quan gì đến các

tham số.

Như vây chương trình sẽ tạo ra các bản sao (các đối) của các tham

số và hàm sẽ thao tác trên các bản sao này, chứ không làm việc trực

tiếp với các tham số. Phương pháp này có 2 nhược điểm chính:

Tốn kém về thời gian và bộ nhớ vì phải tạo ra các bản sao. Không

thao tác trực tiếp trên các tham số, vì vậy không làm thay đổi được giá

trị các tham số.

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

Trong C++ cung cấp thêm cách truyền dữ liệu cho hàm theo tham

chiếu bằng cách dùng đối là biến tham chiếu hoặc đối là hằng tham

chiếu. Cách này có ưu điểm:

Không cần tạo ra các bản sao của các tham số, do đó tiết kiệm bộ

nhớ và thời gian chạy máy.

Hàm sẽ thao tác trực tiếp trên vùng nhớ của các tham số, do đó dễ

dàng thay đổi giá trị các tham số khi cần.

2.3. Mối quan hệ giữa đối và tham số trong lời gọi hàm

Nếu đối là biến hoặc hằng tham chiếu kiểu K thì tham số (trong

lời gọi hàm) phải là biến hoặc phần tử mảng kiểu K. Ví dụ:

+ Đối là biến hoặc hằng tham chiếu kiểu double, thì tham số là

biến hoặc phần tử mảng kiểu double

+ Đối là biến hoặc hằng tham chiếu kiểu cấu trúc, thì tham số là

biến hoặc phần tử mảng kiểu cấu trúc

2.4. Các chương trình minh hoạ

/*

Chương trình sau được tổ chức thành 3 hàm:

Nhập dẫy số double

Hoán vị 2 biến double

Sắp xếp dẫy số double theo thứ tự tăng dần

Chương trình sẽ nhập một dẫy số và in dẫy sau khi sắp xếp

*/

#include <iostream.h>

#include <conio.h>

#include <stdio.h>

void nhapds(double *a, int n)

{

for (int i=1; i<= n ; ++i)

40 41

Tải ngay đi em, còn do dự, trời tối mất!