函数基础
1.1 函数定义与声明
在C++中,函数是执行特定任务的代码块。函数定义包括返回类型、函数名、参数列表和函数体。函数声明则用于告知编译器函数的存在,但不包含函数体。
// 函数声明
void myFunction(int a, int b);
// 函数定义
void myFunction(int a, int b) {
// 函数体
}
1.2 函数调用
函数通过函数名和括号调用,如果需要,可以传递参数。
myFunction(5, 10);
1.3 引用参数
引用参数允许函数直接访问和修改调用者的变量,而不是传递变量的副本。
void increment(int &num) {
num++;
}
int main() {
int x = 5;
increment(x);
return 0;
}
函数重载
2.1 基础实现
函数重载允许使用相同的函数名实现多个函数,只要它们的参数列表不同即可。
void print(int x) {
// 打印int类型
}
void print(double x) {
// 打印double类型
}
2.2 重载决议流程图
编译器根据函数名和参数列表来决定调用哪个函数。
2.3 与 C 语言的本质区别
C++函数重载是编译时多态,而C语言中的函数重载需要使用宏或函数指针。
2.4 实战陷阱
避免在重载函数中使用相同的参数类型,这可能导致编译器无法确定调用哪个函数。
默认参数
3.1 语法规则
在函数声明或定义中,可以为参数指定默认值。
void myFunction(int a, int b = 0) {
// 使用默认值
}
3.2 C 语言替代方案
在C语言中,可以使用宏或全局变量来实现类似的功能。
内联函数
4.1 C vs C++ 的内联差异
C++中的内联函数是请求编译器在每次调用时展开函数体,而C语言中的内联是编译器优化的一部分。
4.2 现代 C++ 实践(C++17)
C++17引入了inline
关键字的新用法,允许在类成员函数中指定内联。
class MyClass {
public:
inline void myMethod() {
// 内联方法
}
};
4.3 内联函数示例
inline int add(int a, int b) {
return a + b;
}
4.4 注意事项
内联函数可能会增加编译时间,因此对于简单函数使用内联关键字时要谨慎。
constexpr 函数
5.1 基础用法
constexpr
函数可以在编译时执行,这对于性能优化和代码优化非常有用。
constexpr int add(int a, int b) {
return a + b;
}
5.2 与 C 宏的本质区别
constexpr
函数是类型安全的,而C宏不是。
5.3 实战案例
constexpr int factorial(int n) {
return n <= 1 ? 1 : n * factorial(n - 1);
}
lambda 表达式
6.1 基础语法
Lambda表达式是匿名函数的语法,可以简化代码。
auto lambda = [](int x) { return x * x; };
6.2 捕获方式对比
Lambda表达式支持捕获外部变量的方式,包括值捕获和引用捕获。
6.3 与 C 函数指针的对比
Lambda表达式比函数指针更灵活,因为它可以捕获外部变量。
6.4 Lambda表达式示例
std::sort(numbers.begin(), numbers.end(), [](int a, int b) { return a < b; });
函数模板
7.1 基础实现
函数模板允许编写泛型函数,可以接受任何类型作为参数。
template<typename T>
T add(T a, T b) {
return a + b;
}
7.2 模板特化
模板特化允许为特定类型重定义模板函数或类。
成员函数
8.1 成员函数分类
成员函数分为构造函数、析构函数和普通成员函数。
8.2 虚函数
虚函数允许在派生类中重新定义基类的函数,实现多态。
8.3 const 成员函数
const成员函数保证不修改对象的状态。
异常规范
9.1 现代 C++ 实践
C++11引入了noexcept
关键字,用于指定函数不会抛出异常。
9.2 与 C 语言的对比
C++的异常处理比C语言的信号处理更强大。
尾随返回类型
10.1 基础用法
尾随返回类型允许在函数定义中省略返回类型。
auto add(int a, int b) -> int {
return a + b;
}
10.2 复杂类型示例
尾随返回类型也适用于复杂类型。
初始化捕获
11.1 语法创新
C++14引入了初始化捕获,允许在lambda表达式中初始化捕获的变量。
11.2 与 C 语言的对比
初始化捕获是C++特有的特性。
友元函数
12.1 基础用法
友元函数允许非成员函数访问类的私有成员。
12.2 友元
友元可以是函数、类或成员函数。
通过以上内容,我们可以看到C++函数的强大和灵活性。掌握这些特性将有助于我们编写更高效、更可维护的代码。