一、auto关键字
在C++中,auto关键字是一个类型说明符,用于自动类型推导。
使用 auto
关键字时,变量的类型 是在编译时由编译器 根据 初始化表达式 自动推导出来的。这意味着你 不能在 声明 auto 变量时 不进行初始化 == 声明 auto 变量时,必须初始化,因为编译器需要这个初始化表达式来确定变量的类型。
int a = 10;
auto b = a;//b也是int型
对于过长或难以拼写的类型,可以用auto代替。
二、内联函数
内联函数的定义与普通函数的定义方式几乎一样,只是需要使用关键字inline,语法形式如下:
inline 类型说明符 函数名(含类型说明的形参表)
{
语句序列
}
inline关键字主要是一个向编译器发出的优化建议,而不是一个强制性的命令。
#include <iostream>
// 声明内联函数
inline int max(int a, int b) {
return (a > b) ? a : b;
}
int main() {
int x = 5, y = 10, z;
z = max(x, y); // 这里调用max函数,编译器可能会将其内联展开
std::cout << "The maximum is " << z << std::endl;
return 0;
}
在函数定义前加上inline
关键字,我们请求编译器在可能的情况下将max函数的调用内联展开。这意味着,在main
函数中调用max(x,y)
时,编译器可能会直接将max
函数的代码(即(a > b) ? a : b
)插入到调用点,它会在调用点将函数的代码直接展开,而不是执行实际的函数调用。这意味着没有栈帧的创建和销毁,也没有参数和返回值的显式传递。
内联展开可以减少函数调用的开销,并提高程序的执行效率,特别是对于小型且频繁调用的函数。
注:内联函数只放头文件,不放源文件 !!!
三、引用&
定义:
引用是某个变量的别名。
特性:
- 引用必须在声明时就被初始化。
- 一旦引用被初始化为某个变量,它就不能再指向另一个变量。
例子:
指针与引用的 异:
- 初始化:引用在声明时必须初始化,且之后不能改变;指针在声明时可以不立即初始化,成为野指针,但使用前必须确保它们已经指向了有效的内存地址。
- 灵活性:指针比引用更灵活,因为它们可以在任何时候指向另一个地址;但这也使得指针更容易出错。
- 安全性:引用在语法层面上提供了一定程度的安全性,因为编译器会检查引用的有效性;而指针需要程序员自己管理,更容易出现错误。
- 用途:引用通常用于函数参数传递和返回值,以减少拷贝;指针则更常用于动态内存管理、数据结构(如链表、树)的实现等场景。
指针与引用的 同:
- 间接访问:引用和指针都允许通过间接的方式访问和操作变量的值,而不是直接访问变量本身。这是它们最核心的相似之处。
- 作为函数参数传递:在函数调用时,引用和指针都可以作为参数传递。
- 作为函数返回值:函数可以返回引用或指针,这样调用者就可以访问和操作函数内部创建或修改的变量的值。
- 实现多态性:在面向对象编程中,引用和指针都可以用来实现多态性。通过基类引用或指针指向派生类对象,可以在运行时根据对象的实际类型来调用相应的虚函数。
四、带默认形参值的函数
注意:
默认形参值必须往后面(右边)给,并且此后,默认形参值的右边的所有参数必须都带默认形参值。
五、函数重载
两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数,这就是函数的重载。
注意:
- 重载函数的形参必须不同:个数不同或者类型不同。
- 编译程序对实参和形参的类型及个数进行最佳匹配,来选择调用哪一个函数。
- 如果函数名相同,形参类型也相同(无论函数返回值类型是否相同),在编译时会被认为是语法错误(函数重复定义)。