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

Thế nào là đối mặc định

Một trong các khả năng mạnh của C++ là nó cho phép xây dựng hàm với các đối có giá trị mặc định. Thông thường số tham số trong lời gọi hàm phải bằng số đối của hàm. Mỗi đối sẽ được khởi gán giá trị theo tham số tương ứng của nó. Trong C++ cho phép tạo giá trị mặc định cho các đối. Các đối này có thể có hoặc không có tham số tương ứng trong lời gọi hàm. Khi không có tham số tương ứng, đối được khởi gán bởi giá trị mặc định.

Hàm delay với đối số mặc định được viết theo một trong 2 cách sau:

Cách 1 (Không khai báo nguyên mẫu):

void delay(int n=1000)

{

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

;

}

Cách 2 (Có khai báo nguyên mẫu):

void delay(int n=1000) ;

void delay(int n)

{

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

;

}

Cách dùng:

+ Cung cấp giá trị cho đối n (Có tham số trong lời gọi hàm)

delay(5000) ; // Đối n = 5000

+ Sử dụng giá trị mặc định của đối (Không có tham số trong lời gọi)

delay() ; // Đối n = 1000

Quy tắc xây dựng hàm với đối mặc định

+ Các đối mặc định cần phải là các đối cuối cùng tính từ trái sang phải. Giả sử có 5 đối theo thứ tự từ trái sang phải là

d1, d2, d3, d4, d5

Khi đó:

nếu một đối mặc định thì phải là d5

nếu hai đối mặc định thì phải là d4, d5

nếu ba đối mặc định thì phải là d3, d4, d5

...

Các ví dụ sai:

d3 và d5 mặc định (khi đó d4 cũng phải mặc định)

d3 và d4 mặc định (khi đó d5 cũng phải mặc định)

+ Khi xây dựng hàm, nếu sử dụng khai báo nguyên mẫu, thì các đối mặc định cần được khởi gán trong nguyên mẫu, ví dụ:

// Khởi gán giá trị cho 3 đối mặc định d3, d4 và d5) void f(int d1, float d2, char *d3=”HA NOI”, int d4 = 100, double d5=3.14) ; void f(int d1, float d2, char *d3, int d4, double d5) { // Các câu lệnh trong thân hàm }

Không được khởi gán lại cho các đối mặc định trong dòng đầu của định nghĩa hàm. Nếu vi phạm điều này thì Chương trình dịch sẽ thông báo lỗi.

+ Khi xây dựng hàm, nếu không khai báo nguyên mẫu, thì các đối mặc định được khởi gán trong dòng đầu của định nghĩa hàm, ví dụ:

// Khởi gán giá trị cho 3 đối mặc định d3, d4 và d5) void f(int d1, float d2, char *d3=”HA NOI”, int d4 = 100, double d5=3.14) { // Các câu lệnh trong thân hàm }

+ Giá trị dùng để khởi gán cho đối mặc đinh

Có thể dùng các hằng, các biến toàn bộ, các hàm để khởi gán cho đối mặc định, ví dụ:

int MAX = 10000; void f(int n, int m = MAX, int xmax = getmaxx(), int ymax = getmaxy() ) ;

Cách sử dụng hàm có đối mặc định

Lời gọi hàm cần viết theo quy định sau:

Các tham số thiếu vắng trong lời gọi hàm phải tương ứng với các đối mặc định cuối cùng (tính từ trái sang phải).

Nói cách khác: Đã dùng giá trị mặc định cho một đối (tất nhiên phải là đối mặc định) thì cũng phải sử dụng giá trị mặc định cho các đối còn lại.

Với hàm có 3 đối mặc định:

void f(int d1, float d2, char *d3=”HA NOI”,

int d4 = 100, double d5=3.14) ;

Thì các lời gọi sau là đúng:

f(3,3.4,"ABC",10,1.0) ; // Đầy đủ tham số

f(3,3.4,"ABC") ; // Thiếu 2 tham số cuối

f(3,3.4) ; // Thiếu 3 tham số cuối

Các lời gọi sau là sai:

f(3) ; // Thiếu tham số cho đối không mặc định d2

f(3,3.4, ,10) ; // Đã dùng giá trị mặc định cho d3, thì cũng

// phải dùng giá trị mặc định cho d4 và d5

Các ví dụ

Hàm ht (bên dưới) dùng để hiển thị chuỗi ký tự dc trên n dòng màn hình. Các đối dc và n đều có giá trị mặc định.

#include <conio.h>

#include <iostream.h>

void ht(char *dc="HA NOI",int n=10) ;

void ht(char *dc , int n )

{

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

cout << "\n" << dc;

}

void main()

{

ht(); // In dòng chữ "HA NOI" trên 10 dòng

ht("ABC",3); // In dòng chữ "ABC" trên 3 dòng

ht("DEF"); // In dòng chữ "DEF" trên 10 dòng

getch();

}

Trình bầy hàm hiển thị một chuỗi str trên màn hình đồ hoạ, tại vị trí (x,y) và có mầu m. Các đối x, y và m là mặc định. Dùng các hàm getmaxx() và getmaxy() để khởi gán cho x, y. Dùng hằng RED gán cho m.

#include <conio.h>

#include <graphics.h>

void hiendc(char *str, int x=getmaxx()/2,

int y = getmaxy()/2, int m=RED);

void hiendc(char *str, int x,int y, int m)

{

int mau_ht = getcolor(); // Luu mau hien tai

setcolor(m);

outtextxy(x,y,str) ;

setcolor(mau_ht); // Khoi phuc mau hien tai

}

void main()

{

int mh=0, mode=0;

initgraph(&mh,&mode,"");

setbkcolor(BLUE);

hiendc("HELLO"); // HELLO mầu đỏ giữa màn hình

hiendc("CHUC MUNG",1,1); // CHUC MUNG mầu đỏ tại vị

// trí (1,1)

hiendc("CHAO",1,400,YELLOW); // CHAO mầu vàng tại vị

// trí (1,400)

getch();

}

Trình bầy hàm tính tích phân xác định gồm 3 đối: f là hàm cần tính tích phân, a và b là các cận dưới và trên (a<b). Cả 3 đối f, a và b đều mặc định. Giá trị mặc định của con trỏ hàm f là địa chỉ của hàm bp (bình phương), của a bằng 0, của b bằng 1.

#include <conio.h>

#include <iostream.h>

#include <iomanip.h>

#include <math.h>

double bp(double x);

double tp( double (*f)(double)=bp,double a=0.0, double b=1.0) ;

double bp(double x)

{

return x*x;

}

double tp(double (*f)(double), double a, double b )

{

int n=1000;

double s=0.0, h=(b-a)/n;

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

s+= f(a+i*h + h) + f(a+i*h ) ;

return s*h/2;

}

void main()

{

clrscr();

cout << setiosflags(ios::showpoint) << setprecision(2);

cout << "\nTich phan tu 0 den 1 cua x*x= " << tp() ;

cout << "\nTich phan tu 0 den 1 cua exp(x)= " << tp(exp);

cout << "\nTich phan tu 0 den PI/2 cua sin(x) " <<

tp(sin,0,3.14/2);

getch();

}