C++函数定义与调用,形参与实参
在C++中,函数定义的语法如下:
返回值类型 函数名(形参列表) { // 函数体 }
其中,返回值类型
表示函数返回的数据类型,可以是基本数据类型、结构体、类或指针等;函数名
是标识符,用于调用函数;形参列表
是由逗号分隔的一组形参,形参指定了函数所需的参数类型和参数名称。
函数调用的语法如下:
函数名(实参列表);
其中,函数名
是要调用的函数的名称,实参列表
是由逗号分隔的一组实参,实参是传递给函数的具体数据,可以是基本数据类型、结构体、类、指针或引用等。
在函数调用时,实参将传递给形参。形参与实参的类型和名称必须匹配,否则编译器将无法通过。函数执行完毕后,可以通过return
语句将结果返回给调用者。
在函数定义和调用中,参数的传递可以是按值传递、按指针传递或按引用传递。按值传递将实参的值复制给形参,在函数内部对形参的修改不会影响到实参的值;按指针传递将实参的地址传递给形参,在函数内部可以通过指针修改实参的值;按引用传递也将实参的地址传递给形参,但语法更简洁,可以通过修改形参来修改实参的值。
函数的定义和调用是C++程序设计的重要组成部分,合理的函数设计可以提高程序的模块化和可维护性。
下面是一个示例程序,演示了C++函数定义和调用的基本用法:
#include <iostream> #include <string> using namespace std; // 声明函数 int sum(int a, int b); void printMessage(string message); void swap(int& a, int& b); // 主函数 int main() { int x = 3, y = 4; int result = sum(x, y); cout << "The sum of " << x << " and " << y << " is " << result << endl; string message = "Hello, World!"; printMessage(message); cout << "Before swapping: x = " << x << ", y = " << y << endl; swap(x, y); cout << "After swapping: x = " << x << ", y = " << y << endl; return 0; } // 定义函数 int sum(int a, int b) { return a + b; } void printMessage(string message) { cout << message << endl; } void swap(int& a, int& b) { int temp = a; a = b; b = temp; }
在这个示例程序中,我们定义了三个函数:sum()
、printMessage()
和swap()
。其中,sum()
函数接收两个整数参数并返回它们的和,printMessage()
函数接收一个字符串参数并将其输出到控制台,swap()
函数接收两个整数参数的引用,并交换它们的值。
在主函数中,我们首先声明两个整数变量x
和y
,并将它们的值分别设为3和4。然后,我们调用sum()
函数将x
和y
相加,并将结果存储在result
变量中,最后将结果输出到控制台。
接下来,我们声明一个字符串变量message
,并将其设为"Hello, World!"。然后,我们调用printMessage()
函数并将message
作为参数传递进去,函数将字符串输出到控制台。
最后,我们声明两个整数变量x
和y
,并将它们的值分别设为3和4。然后,我们调用swap()
函数并将x
和y
的引用作为参数传递进去,函数将交换它们的值。最后,我们输出交换后的结果到控制台。
这个示例程序演示了C++函数定义和调用的基本用法,以及不同类型的函数参数传递方式。通过函数的模块化设计,可以让程序更加清晰、易于理解和维护。
下面继续介绍C++函数定义和调用中的形参和实参的概念。
形参和实参是函数定义和函数调用之间数据传递的桥梁。函数定义时,可以指定一个或多个形参,用于接收传递进来的数据。函数调用时,需要提供相应的实参,将具体的数据传递给函数,供其进行处理。
形参和实参的具体用法和规则如下:
形参定义
形参是在函数定义时声明的变量,用于接收传递进来的数据。形参的定义方式和变量的定义方式相同,但必须指定类型和名称。例如:
void func(int a, double b, char c);
这个函数定义了三个形参,分别为一个整型变量a
、一个双精度浮点型变量b
和一个字符型变量c
。
实参传递
实参是在函数调用时提供的具体数据,用于传递给形参进行处理。实参可以是常量、变量或表达式,但必须与形参的类型和数量相匹配。例如:
func(10, 3.14, 'A');
这个函数调用传递了三个实参,分别为一个整型常量10
、一个双精度浮点型常量3.14
和一个字符型常量'A'
。
值传递
在函数调用时,实参的值被复制到形参中,形参的修改不会影响实参的值。这种传递方式称为值传递。例如:
void func(int x) { x = x + 1; } int main() { int a = 10; func(a); cout << a << endl; // 输出10 return 0; }
在这个例子中,我们定义了一个函数func()
,它接收一个整型参数x
,将其加1后再赋值给x
。在主函数中,我们声明了一个整型变量a
,并将其值设为10。然后,我们调用func()
函数并将a
作为实参传递进去。在函数内部,形参x
的值被修改为11,但这个修改不会影响到实参a
的值,因此最终输出结果为10。
引用传递
在函数调用时,实参的地址被传递给形参,形参的修改会影响实参的值。这种传递方式称为引用传递。例如:
void func(int& x) { x = x + 1; } int main() { int a = 10; func(a); cout << a << endl; // 输出11 return 0; }
在这个例子中,我们定义了一个函数func()
,它接收一个整型引用参数x
,将其加1后再赋值给x
。在主函数中,我们声明了一个整型变量a
,并将其值设为10。然后,我们调用func()
函数并将a
作为实参传递进去。在函数内部,形参x
的值被修改为11,同时这个修改也影响到了实参a
的值,因此最终输出结果为11。
指针传递
在函数调用时,实参的地址被传递给形参的指针,形参通过指针访问实参的值进行操作。这种传递方式称为指针传递。例如:
void func(int* ptr) { *ptr = *ptr + 1; } int main() { int a = 10; func(&a); cout << a << endl; // 输出11 return 0; }
在这个例子中,我们定义了一个函数func()
,它接收一个指向整型变量的指针参数ptr
,将其指向的值加1后再赋值给指针所指向的位置。在主函数中,我们声明了一个整型变量a
,并将其值设为10。然后,我们调用func()
函数并将a
的地址作为实参传递进去。在函数内部,形参ptr
通过指针访问实参a
的值,并将其修改为11,因此最终输出结果为11。
默认参数
在函数定义时,可以为形参指定默认值。当函数调用时,如果实参没有提供对应的值,就会使用形参的默认值。例如:
void func(int a, int b = 10, int c = 20) { cout << a << " " << b << " " << c << endl; } int main() { func(1); // 输出1 10 20 func(2, 3); // 输出2 3 20 func(4, 5, 6); // 输出4 5 6 return 0; }
在这个例子中,我们定义了一个函数func()
,它有三个整型形参,其中b
和c
有默认值分别为10和20。在主函数中,我们分别以不同的方式调用func()
函数。第一个函数的参数列表中,只能有一个参数有默认值,而且这个参数必须是最后一个非指针形参。
函数重载
函数重载是指在同一个作用域中定义多个同名但参数列表不同的函数。编译器会根据实参的类型、个数和顺序来确定调用哪个函数。例如:
void func(int x) { cout << "int " << x << endl; } void func(double x) { cout << "double " << x << endl; } int main() { func(10); // 输出int 10 func(3.14); // 输出double 3.14 return 0; }
在这个例子中,我们定义了两个同名函数func()
,一个接收一个整型参数,另一个接收一个双精度浮点型参数。在主函数中,我们分别调用func()
函数,并根据实参的类型选择了不同的函数。第一次调用时,实参为整型10,因此调用了func(int x)
函数,输出结果为"int 10";第二次调用时,实参为双精度浮点型3.14,因此调用了func(double x)
函数,输出结果为"double 3.14"。
函数重载可以提高代码的可读性和可维护性,避免使用不同名称的函数来完成类似的功能。
总结:
C++中函数的定义和调用是程序中必不可少的部分,掌握好函数的基本语法和调用方法,能够提高代码的可读性和可维护性。在函数定义时,可以使用参数列表、返回值类型、函数名和函数体来描述函数的功能和实现方法。在函数调用时,可以使用实参来传递数据,使用函数名和实参列表来调用函数,并使用返回值来获取函数执行后的结果。此外,C++中还支持函数的重载、默认参数和引用传递等特性,可以根据实际需求来选择合适的函数形式和调用方法。

- 上一篇:C++string类的综合应用
- 下一篇:C++中函数传值参数与传引用参数·