在使用C语言编程过程中,C语言的要求之严格,编程过程之繁琐,大同小异的重复性工作,令C++之父使用C语言编程时也深受其扰,于是乎C++兼容C小语法诞生了
一、缺省参数
在C++中,缺省参数(也称为默认参数)允许在定义函数时为参数指定一个默认值。如果在调用函数时没有提供这个参数的值,那么就会使用默认值。
1.默认参数规则:
(1)只能从左往右传实参,形参只能从右往左缺省
(2)不能在函数声明和函数定义同时给默认参数(一般在函数声明时给)
2.全缺省和半缺省
(1)全缺省:全部参数都设置默认值
(2)半缺省:部分参数设置默认值
代码示例:
#include <iostream>
using namespace std;
//全缺省
void printNumbers(int number1 = 1, int number2 = 2)
{cout << "Number 1: " << number1 << ", Number 2: " << number2 << endl;
}
//半缺省
void fun(int a, int b=5)
{cout << "a=" << a << ",b=" << b << endl;
}int main() {// 调用函数时提供所有参数printNumbers(10, 20);// 调用函数时省略第二个(使用默认值)printNumbers(40);// 调用函数时不提供任何参数(使用所有默认值)printNumbers();// 调用函数时提供所有参数fun(10, 20);// 调用函数时省略第二个(使用默认值)fun(10);//fun();//错误a没有默认值,缺少实参return 0;
}
运行结果:
二、函数重载
函数重载(Function Overloading)简单来说,它允许我们在同一个作用域内定义多个具有相同名称但参数列表不同的函数。
函数重载前提:
1.同一作用域
2.函数名相同
3.功能类似
区分:参数列表不同,包括参数的类型、个数、类型顺序不同
注:函数返回类型不能区分函数重载
问:为什么c不支持函数重载,c++怎么支持函数重载?
答:首先我们要知道编译的四个过程:
预处理->编译->汇编-> 链接
简单来说:C语言不支持函数重载是因为在连接时直接使用函数名来对函数进行查找
C++是使用修饰过后的函数名(包含函数参数信息)来查找
详细回答如下:
C语言不支持函数重载的原因主要在于其编译后的函数名处理机制。C语言在编译后,会将函数名转化为一个唯一的标识符(通常是在函数名前加上一个下划线),这个标识符在链接阶段用于确定函数的具体实现。由于这个机制并不区分函数的参数类型或数量,所以当存在多个同名但参数不同的函数时,编译器无法区分它们,从而导致编译错误。
然而,C++语言则通过一种称为“名字修饰”(Name Mangling)的技术来支持函数重载。在C++中,编译器在编译过程中会对函数名进行修饰,这种修饰会包含函数的参数类型、数量等信息。因此,在C++中,即使函数名相同,只要参数列表不同(包括参数类型、数量或顺序的不同),那么它们就会被视为不同的函数,从而实现了函数重载。
具体来说,C++编译器在编译时,会将函数名和参数信息一起进行编码,生成一个独一无二的“修饰名”。这个修饰名在链接阶段用于确定函数的具体实现。由于修饰名中包含了函数的参数信息,所以即使函数名相同,只要参数列表不同,它们的修饰名也会不同,从而实现了函数重载。
代码示例:
#include <iostream>
using namespace std;
// 第一个重载函数,无参数
void sayHello() {cout << "Hello, world!" << endl;
}// 第二个重载函数,接受一个int类型的参数
void sayHello(int times) {for (int i = 0; i < times; ++i) {cout << "Hello, " << i + 1 << " time!" << endl;}
}// 第三个重载函数,接受一个double类型的参数,表示某种权重或值
void sayHello(double weight) {cout << "Hello with weight: " << weight << endl;
}int main() {sayHello();sayHello(3);sayHello(1.5);return 0;
}
运行结果:
欢迎大家一起学习交流,有错误可以指正