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#

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ả

return_type

Kiểu dữ liệu mà hàm trả về, một số tùy chọn phổ biến là:

  • void — Không trả về gì
  • int — Trả về một giá trị số nguyên
  • double — Trả về một số thực
  • bool — Trả về true hoặc false
  • char — Trả về một ký tự đơn
  • const char* — Trả về một chuỗi văn bản
  • kiểu dữ liệu do người dùng định nghĩa — Trả về một struct hoặc đối tượng lớp

function_name

Tên của hàm.

parameters

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 type name, trong đó type chỉ định kiểu dữ liệu của tham số và name là mã định danh được sử dụng để truy cập giá trị đó bên trong hàm. Các tham số nhận giá trị đầu vào khi hàm được gọi.

result

Tùy chọn. Giá trị được hàm trả về. Nếu kiểu trả về return_type không phải là void, thì giá trị này phải được cung cấp và kiểu của nó phải khớp chính xác với kiểu trả về return_type.

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);
}