Truyền đối số bằng tham biến trong C++

Khi một hàm mà được định nghĩa và khai báo trong chương trình thì hàm main(), các hàm khác và thậm chí hàm đó có thể gọi đến chính nó. Trong C++, có các cách truyền đối số (arguments) cho hàm bằng giá trị và tham biến.

Khi truyền đối số cho hàm bằng giá trị thì đối số truyền vào hàm sẽ không bị thay đổi giá trị trong hàm đó khi ra khỏi hàm. Nhưng trong những trường hợp chúng ta cần hàm có thể làm thay đổi giá trị đối số mà chúng ta truyền vào cho hàm thì chúng ta phải làm sao. Tất nhiên là không thể truyền đối số bằng giá trị. Có một cách để giải quyết vấn đề đó là truyền đối số bằng tham biến.

Lợi ích của việc truyền đối số bằng tham biến :

– Nó cho phép thay đổi giá trị qua lời gọi hàm, mà thỉnh thoảng điều đó vẫn cần thiết và có ích.

– Bởi vì không phải copy đối số vào tham số, nên lời gọi hàm sẽ nhanh ngay cả khi thực hiện với struct hoặc class lớn.

– Chúng ta có thể sử dụng truyền đối số bằng tham biến hằng để tránh đối số thay đổi giá trị không như mong muốn

– Chúng ta có thể trả về nhiều giá trị từ một hàm

Nhược điểm của việc truyền đối số bằng tham biến : Truyền đối số bằng tham biến thì không thể thực hiện trên một số hoặc một biến thức mà phải thực hiện trên một biến bình thường.

Để truyền đối số bằng tham biến, khi chúng ta khai báo tham số cho hàm là tham biến thay vì biến bình thường :

void AddOne(int &y) // y la bien tham biến

{

     y = y + 1;

}

Khi hàm AddOne được gọi, y sẽ trở thành tham chiếu của đối số. Do nó là tham chiếu của đối số, nên nó sẽ được đối xử giống như bản thân đối số nghĩa là bất cứ thay đổi nào ở tham biến đều được truyền lên cho đối số.

Chúng ta xem chương trình ví dụ dưới đây :

void foo(int &y) // y la tham bien

     using namespace std;

     cout << “y = ” << y << endl;

     y = 6;

     cout << “y = ” << y << endl;

} // y bi huy tai day

int main()

{

     int x = 5;

     cout << “x = ” << x << endl;

     foo(x);

     cout << “x = ” << x << endl;

     return 0;

}

Dưới đây chúng ta có một ví dụ khác :

void AddOne(int &y)

{

     y++;

}

int main()

{

     int x = 5;

     cout << “x = ” << x << endl;

     AddOne(x);

     cout << “x = ” << x << endl;

     return 0;

}

Kết quả xuất ra màn hình :

x = 5;

x = 6;

Như bạn thấy ở trên, hàm đã có thể thay đổi giá trị của đối số.

Thỉnh thoảng, chúng ta cần một hàm trả về nhiều giá trị. Tuy nhiên, một hàm chi có thể trả về một giá trị. Một cách để trả về nhiều giá trị của hàm là sử dụng tham biến làm tham số.

#include

#include

// de su dung sin() va cos()

void GetSinCos(double dX, double &dSin, double &dCos)

{

     dSin = sin(dX);

     dCos = cos(dX);

}

int main()

{

     double dSin = 0.0;

     double dCos = 0.0;

     // GetSinCos se tra ve sin va co strong dSing, dCos

     GetSinCos(30.0, dSin, dCos);

     std::cout << “The sin is ” << dSin << std::endl;

     std::cout << “The cos is ” << dCos << std::endl;

     return 0;

}

Hàm GetSinCos có một tham số (là giá trị) làm input và trả về hai tham số (là đối số) làm output.

Truyền Vào Tham Số Hằng (const reference)

Một điểm bất lợi lớn nhất của việc truyền đối số bằng giá trị bởi vì giá trị được copy cho tham số. Khi đối số là struct hoặc class lớn, điều này làm tốn nhiều thời gian. Tham biến cung cấp cho chúng ta một cách để tránh được sự bật lợi này. Khi đối số truyền bởi tham biến, môt tham biến của đối số được tạo (có phạm vi trong hàm đó thôi) và không cần phải copy giá trị. Điều này cho phép chúng ta truyền một struct hoặc một lớp lớn với thời gian thực thi nhanh.

Tuy nhiên, điều này có thể là nguyên nhân dẫn đến nhiều vấn đề nghiêm trọng cho chương trình của bạn. Tham chiếu cho phép hàm thay đổi giá trị của đối số, trong nhiều trường hợp là rất rắc rồi. Chúng ta đã biết rằng một hàm không nên thay đổi giá trị của đối số nhưng chúng ta không muốn truyền đối số bằng giá trị, cách tốt nhất để giải quyết vấn đề này là truyền tham biến hằng.

Bạn đã biết rằng tham biến hằng là một tham biến nhưng không cho phép biến được thay đổi giá trị. Do đó, nếu chúng ta sử dụng tham biến hằng như là một tham số, chúng ta có thể đảm bảo được rằng lời gọi hàm sẽ không thay đổi giá trị của đối số.

void foo(const int &x)

{

     x = 6; // x la tham bien hang va ko bi thay doi gia tri

}

Sử dụng tham biến hằng có thể giúp chúng ta giải quyết được nhược điểm của việc truyền đối số bằng giá trị

Quy tắc : luôn luôn truyền đối số bằng tham số hằng trừ khi bạn muốn thay đổi giá trị của đối số.

Những chia sẻ trên hi vọng bạn sẽ hiểu hơn về cách truyền đối số bằng tham biến trong C++.

 

Đánh giá của bạn

Add Comment