Chức năng#
Giới thiệu#
Hàm là một thành phần cơ bản của lập trình C++, chúng đóng gói các đoạn mã thành các phần mã hiệu quả, có thể tái sử dụng được, được thiết kế để thực hiện một nhiệm vụ cụ thể. Hàm có thể được gọi nhiều lần trong một chương trình, giúp việc tổ chức mã dễ dàng hơn và tránh lặp lại mã. Hàm cũng giúp việc gỡ lỗi mã dễ dàng hơn.
Trang này trình bày những kiến thức cơ bản về cách sử dụng hàm trong C++, bao gồm:
Cấu trúc và cú pháp hàm — Cách viết hàm trong C++, bao gồm kiểu trả về, tên và tham số.
Nguyên mẫu hàm — Hàm nguyên mẫu là gì và tại sao chúng được sử dụng.
Định nghĩa và gọi hàm — Cách tạo hàm và gọi chúng từ chương trình của bạn.
Giá trị trả về — Cách các hàm có thể gửi dữ liệu trở lại cho người gọi.
Truyền tham chiếu — Cách các hàm có thể sửa đổi biến bên ngoài phạm vi của chúng.
Hàm gọi lại — Cách các hàm có thể được truyền vào các hàm khác và được gọi tự động để đáp ứng các sự kiện.
Các hàm có đối số mặc định — Cách các tham số có thể được gán giá trị mặc định khi không có đối số nào được cung cấp.
Cấu trúc và cú pháp hàm#
Trong C++, hàm phải được khai báo với kiểu trả về, tên hàm và tham số. Cú pháp cơ bản là:
return_type function_name(parameters) {
// Code to execute when the function is called
return result; // Optional, used to return a value
}
Các bộ phận chức năng |
Sự miêu tả |
|---|---|
|
Kiểu dữ liệu mà hàm trả về, một số tùy chọn phổ biến là:
|
|
Tên của hàm. |
|
Tùy chọn. Một danh sách các tham số được phân tách bằng dấu phẩy, được viết theo định dạng |
|
Tùy chọn. Giá trị được hàm trả về. Nếu kiểu trả về |
Lưu ý: Một hàm phải luôn được khai báo trước khi nó được gọi, hoặc bạn phải cung cấp một nguyên mẫu hàm.
Nguyên mẫu chức năng#
Trong C++, mã được đọc từ trên xuống dưới. Điều này có nghĩa là trình biên dịch phải biết đến một hàm trước khi nó có thể được gọi.
Nguyên mẫu hàm cho phép bạn sử dụng một hàm trước khi viết toàn bộ mã của nó. Điều này cho phép bạn giữ lệnh main() gần đầu chương trình trong khi đặt các định nghĩa hàm ở phía sau, nơi chúng dễ tổ chức và dễ đọc hơn.
Nếu không có nguyên mẫu, bạn sẽ phải định nghĩa mọi hàm ở trên main()(), điều này có thể khiến các dự án khó theo dõi hơn khi chúng phát triển.
Định nghĩa nguyên mẫu hàm (bên ngoài
int main())// The function's prototype void greeting();Gọi hàm bên trong
int main()int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); greeting(); }Viết phần thân của hàm sau
void greeting() { Brain.Screen.print("Hello!"); }
Định nghĩa và gọi hàm#
Functions with No Parameters#
Nếu một hàm không yêu cầu đầu vào, bạn có thể định nghĩa nó mà không cần tham số. Sử dụng void làm kiểu trả về nếu hàm không trả về giá trị.
Định nghĩa hàm (bên ngoài
int main())// Define a function to display a message void greeting() { Brain.Screen.print("Hello!"); }Gọi hàm bên trong
int main()int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); // Call the function to display the message greeting(); }
Functions with Parameters#
Bạn cũng có thể thêm tham số vào hàm, cho phép bạn truyền thông tin để hàm sử dụng.
Lưu ý: Văn bản có thể được truyền bằng chuỗi kiểu C (const char*) hoặc chuỗi C++ (std::string).
Định nghĩa hàm (bên ngoài
int main())// Define a function with a parameter void namedGreeting(const char* name) { Brain.Screen.print("Hello, %s!", name); }Gọi hàm với tham số bên trong
int main()int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); // Call the function to display the message namedGreeting("Stranger"); }
Giá trị trả về#
Các hàm có thể gửi dữ liệu trở lại cho hàm gọi bằng cách sử dụng từ khóa return Điều này cho phép bạn thu thập và sử dụng kết quả đầu ra trong dự án của mình.
Định nghĩa hàm (bên ngoài
int main())// Define a function that multiplies numbers by 2 int timesTwo(int number) { return number * 2; }Gọi hàm với tham số bên trong
int main()int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); // Display the return value Brain.Screen.print("%d", timesTwo(2)); }
Truyền đạt bằng tham chiếu#
Theo mặc định, C++ truyền tham số hàm theo giá trị, nghĩa là hàm nhận một bản sao của biến gốc variable. Những thay đổi được thực hiện bên trong hàm không ảnh hưởng đến giá trị gốc.
Định nghĩa hàm (bên ngoài
int main())// Add 1 to the number void addOne(int number) { number++; }Gọi hàm với tham số bên trong
int main()int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); int value = 5; addOne(value); // "value" will still be 5 }
Để cho phép một hàm sửa đổi biến gốc variable, các tham số có thể được truyền bằng tham chiếu bằng cách sử dụng ký hiệu &.
Định nghĩa hàm (bên ngoài
int main())// Add 1 to the number void addOne(int& number) { number++; }Gọi hàm với tham số bên trong
int main()int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); int value = 5; addOne(value); // "value" will now be 6 }
Truyền tham chiếu cho phép các hàm cập nhật biến được định nghĩa bên ngoài hàm mà không cần trả về giá trị.
Hàm gọi lại#
Hàm gọi lại (callback function) là một hàm được truyền vào một hàm khác và được gọi tự động khi một sự kiện cụ thể xảy ra.
Hàm callback thường được sử dụng cho các sự kiện như nhấn nút hoặc cập nhật cảm biến.
Thay vì tự gọi hàm, dự án sẽ tự động gọi hàm đó khi sự kiện xảy ra.
Xác định hàm gọi lại (bên ngoài
int main())// Create a callback function void onPressed() { Brain.Screen.print("Screen pressed!"); }Đăng ký hàm gọi lại bên trong
int main()int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); // Call onPressed whenever the screen is pressed Brain.Screen.pressed(onPressed); }
Callback Signatures#
Mỗi hàm gọi lại phải tuân theo một chữ ký cụ thể, trong đó định nghĩa:
Kiểu trả về
Số lượng tham số
Các loại tham số
Chữ ký cần thiết được xác định bởi API. Hàm gọi lại phải khớp chính xác với chữ ký này.
// This callback function cannot include any parameters
void callback(void);
// This callback function includes four parameters
void callback(axisType axis, double x, double y, double z);
Tên tham số mang tính mô tả và có thể khác nhau, nhưng kiểu dữ liệu trả về, thứ tự tham số và kiểu dữ liệu của tham số phải hoàn toàn trùng khớp.
Các hàm có đối số mặc định#
Các hàm có thể định nghĩa giá trị mặc định cho một hoặc nhiều tham số. Tham số mặc định được sử dụng khi không có giá trị nào được cung cấp cho tham số đó khi hàm được gọi.
Quy tắc cho các tham số mặc định:
Các tham số mặc định phải là các tham số cuối cùng trong định nghĩa hàm.
Khi một tham số đã có giá trị mặc định, tất cả các tham số sau đó cũng phải có giá trị mặc định.
Nếu một hàm chỉ định các đối số mặc định trong nguyên mẫu của nó, thì các giá trị mặc định đó không được chỉ định lại trong định nghĩa hàm.
Định nghĩa hàm (bên ngoài
int main())// Required parameter first, default parameter last void greeting(const char* name, int repeatCount = 1) { for (int i = 0; i < repeatCount; i++) { Brain.Screen.print("Hello, %s!", name); Brain.Screen.newLine(); } }Gọi hàm bên trong
int main()int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); // Say what name to greet (EXP) and // use default value for repeatCount (1) greeting("EXP"); Brain.Screen.newLine(); // Overrides the default value to 3 greeting("EXP", 3); }
// Required parameter first, default parameter last
void greeting(const char* name, int repeatCount = 1) {
for (int i = 0; i < repeatCount; i++) {
Brain.Screen.print("Hello, %s!", name);
Brain.Screen.newLine();
}
}
int main() {
vexcodeInit();
// Say what name to greet (EXP) and
// use default value for repeatCount (1)
greeting("EXP");
Brain.Screen.newLine();
// Overrides the default value to 3
greeting("EXP", 3);
}