目录
C++中的函数主要分为以下几类:内置函数、标准库函数、用户自定义函数、成员函数、虚函数和函数模板。下面分别介绍这些函数的特点和用法。
一、内置函数
C++语言本身提供了一些内置函数,它们是编译器自带的函数,可以直接在程序中使用。常见的内置函数包括数学函数、字符串函数、类型转换函数等。例如,
sin()
函数用于计算正弦值,
strlen()
函数用于计算字符串的长度,
atoi()
函数用于将字符串转换为整数等。这些函数都属于C++的标准库函数,因此在程序中无需显式包含相应的头文件即可直接使用。
二、标准库函数
标准库函数是C++标准库提供的一组函数,它们可以实现各种常见的操作,包括输入输出、容器操作、算法操作等。标准库函数通常定义在各自的头文件中,例如
<iostream>
头文件中定义了输入输出函数,
<vector>
头文件中定义了向量容器类,
<algorithm>
头文件中定义了各种算法函数等。
三、用户自定义函数
用户自定义函数是程序员自己定义的函数,可以根据实际需求定义不同类型的函数来实现不同的功能。用户自定义函数的基本结构包括函数头和函数体,其中函数头包括函数名、参数列表和返回值类型,函数体包括函数的具体实现。例如,下面是一个简单的用户自定义函数示例:
int add(int a, int b) {
return a + b;
}
int main() {
int sum = add(1, 2); // 调用add()函数计算1+2的和
cout << sum << endl; // 输出3
return 0;
}
在这个示例中,
add()
函数是一个用户自定义函数,它接受两个整数参数并返回它们的和。在
main()
函数中,我们调用了
add()
函数来计算1和2的和,并将结果存储在变量
sum
中。
四、成员函数
成员函数是定义在类中的函数,它们可以访问类的私有成员和保护成员。成员函数的调用方式包括通过对象和通过指针。通过对象调用成员函数时,可以使用点运算符
.
来访问成员函数;通过指针调用成员函数时,可以使用箭头运算符
“->”
来访问成员函数。
下面是一个简单的成员函数示例:
class Rectangle {
public:
int area() {
return width * height;
}
private:
int width;
int height;
};
int main() {
Rectangle rect;
rect.width = 5;
rect.height = 4;
int area = rect.area(); // 通过对象调用area()函数计算面积
cout << area << endl; // 输出20 return 0;
}
在这个示例中,`Rectangle`类定义了一个名为`area()`的成员函数,用于计算矩形的面积。在`main()`函数中,我们创建了一个`Rectangle`对象,并通过点运算符`.`调用`area()`函数来计算矩形的面积。
五、虚函数
虚函数是一种在基类中声明、在派生类中实现的函数,用于实现多态。虚函数允许派生类重写基类的函数,从而实现不同的功能。当通过基类指针或引用调用虚函数时,实际调用的是派生类中的函数。
下面是一个简单的虚函数示例:
class Shape {
public:
virtual int area() {
return 0;
}
};
class Rectangle : public Shape {
public:
Rectangle(int w, int h) : width(w), height(h) {}
int area() {
return width * height;
}
private:
int width;
int height;
};
int main() {
Shape *shape = new Rectangle(5, 4);
int area = shape->area(); // 调用Rectangle中的area()函数计算面积
cout << area << endl; // 输出20
delete shape;
return 0;
}
在这个示例中,
Shape
类定义了一个虚函数
area()
,并将其声明为虚函数,以便在派生类中重写。
Rectangle
类是
Shape
类的派生类,它重写了
area()
函数以计算矩形的面积。在
main()
函数中,我们通过
Shape
指针创建了一个
Rectangle
对象,并调用了
area()
函数来计算矩形的面积。
六、函数模板
函数模板是一种通用的函数定义,可以用来创建多个具有相似功能的函数。函数模板定义时使用类型参数,可以在函数调用时指定具体的类型,从而创建对应的函数。函数模板可以用于任何类型,包括内置类型、用户自定义类型和标准库类型。
下面是一个简单的函数模板示例:
template<typename T>
T max(T a, T b) {
return a > b ? a : b;
}
int main() {
int i = max(1, 2);
double d = max(3.14, 2.71);
cout << i << endl; // 输出2
cout << d << endl; // 输出3.14
return 0;
}
在这个示例中,
max
函数是一个函数模板,它用于返回两个参数中的最大值。函数模板的类型参数是
T
,可以用于任何类型。在
main()
函数中,我们调用了两次
max
函数,一次使用整数参数,一次使用双精度浮点数参数。由于编译器能够自动推断出函数模板的类型参数,因此我们不需要显式地指定类型参数。
七、Lambda表达式
Lambda表达式是C++11中引入的一种新的函数定义语法。它可以在需要函数的任何地方定义一个函数,而不必显式地声明函数类型和名称。Lambda表达式通常用于作为参数传递给其他函数,或作为STL算法的操作函数。
Lambda表达式的一般语法如下:
[capture list](parameter list) -> return type {
function body
}
其中,
capture list
用于指定Lambda表达式访问的外部变量;
parameter list
用于指定函数参数;
return type
用于指定函数返回值类型(可以省略);
function body
用于定义函数的代码。
下面是一个Lambda表达式示例:
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {1, 2, 3, 4, 5};
int sum = 0;
for_each(v.begin(), v.end(), [&sum](int x) { sum += x; });
cout << sum << endl; // 输出15
return 0;
}
在这个示例中,我们使用STL算法
for_each
遍历了一个整数向量,并使用Lambda表达式计算向量中所有整数的和。Lambda表达式的参数列表包含了一个
int
类型的参数
x
,
function body
部分使用了这个参数计算和,并将结果累加到
sum
变量中。
[&sum]
部分用于将
sum
变量作为Lambda表达式的外部变量进行捕获。由于Lambda表达式的返回值类型可以被推断出来,因此我们没有指定返回值类型。