C++中引用 函数高级
引用
本质上引用是一种C++内部实现的简化版指针操作,同样是透过变量名到地址操作内存。
int& ref = a; // <==> int* const ref = &a;
因此,引用一旦初始化以后就不能改变
关于引用做函数返回值
#include <iostream>
#include <string>
using namespace std;
// 错误:返回局部变量的引用
int& getLocalRef() {
int local = 42;
return local;
}
// 一个普通函数,会大量使用栈
void useStack() {
int bigArray[1000];
for (int i = 0; i < 1000; i++) {
bigArray[i] = i;
}
}
int main() {
int& ref = getLocalRef();
cout << "第一次读取 ref: " << ref << endl; // 可能输出 42
useStack(); // 覆盖栈内存
cout << "第二次读取 ref: " << ref << endl; // 输出不确定,不再是 42
cout << "第三次读取 ref: " << ref << endl; // 继续变化
return 0;
}
/*
第一次读取 ref: 42
第二次读取 ref: 1000
第三次读取 ref: 0
*/
一个典型的错误示例。函数的引用是局部变量,是挂载在栈帧上的。随着函数的调用和结束,同一位置会不断有栈帧进栈和出栈。此时ref指向的就是指定位置的局部变量,位置是存在的,但是其中内容频繁变动,极不可控。
常量引用
const int &ref = 10; 此时const就是在修饰ref指向地址内的值,禁止修改。
函数高级
默认参数
函数参数给默认值:int func(int a = 10){}
1.如果一个形参有默认值,其后向右所有参数都有默认值。
2.声明和实现只能出现一次默认参数。避免默认参数二义性
占位参数
去除形参只保留数据类型;可以有默认参数
函数重载
C++中函数名允许相同,但是必须在同一作用域下,函数参数必须(个数/顺序/类型)不同
引用中const可以作为函数重载的条件
有默认参数的情况下:参数相同,必定导致歧义;参数不同,一者有默认参数,可能会导致调用歧义,依然会报错。
浙公网安备 33010602011771号