int a = 0;
int& b = 0;
即 地址为0x000000BC0C6FFB94的空间即可以称为“a”,也可以成为“b”
引用:类型& 引用变量名(对象名) = 引用实体;
引用变量名 必须有且只有一个引用实体
int a = 0;
int& b = a;
int& c = b;
int* p = &a;
int*& pb = p;
void TestConstRef()
{
const int a = 10;
//int& ra = a; // 该语句编译时会出错,a为常量
//正确的:
const int& ra = a;
// int& b = 10; // 该语句编译时会出错,b为常量(非常量引用的初始值必须为左值),10为常量,int为整型变量
//正确的:
const int& b = 10;
double d = 12.34;
//int& rd = d; // 该语句编译时会出错,类型不同
//正确的:
const int& rd = d;
}
1.做函数参数:输出型函数,形参的改变需要影响实参
void Swap(int& x, int& y)
{
int tmp = x;
x = y;
y = tmp;
}
int main()
{
int x = 13, y = 7;
Swap(x, y);
cout << x << " " << y << endl;
return 0;
}
2.做返回值:引用返回
如上图,引用返回的作用:①减少拷贝;②调用者可以修改返回对象
变量 add 的空间在函数结束后被归还给操作系统,则 add 空间储存的内容将不得而知。
//C语言:传值返回
int func(const int x, const int y)
{
int n = x + y;
return n;
}
//C++:引用返回
int& func()
{
static int n = 0;
n++;
// ...
return n;
}
int& Add(int x, int y)
{
int add = x + y;
return add;
}
int main()
{
cout << "Add=" << Add(x, y) << endl;
Count();
Count();
Count();
Count();
Count();
cout << "Count=" << Count() << endl;
return 0;
}
输出:
Add=-858993460 随机值
Count=6
以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。
⭐指针、引用和赋值,权限可以缩小,但是不能放大
const int c = 2;//对c空间只有“只读”的权限
int& d = c;
int x = 1;//可读可写
const int& y = x;//可读
const int* p1 = nullptr;
const int* p2 = p1;
语法上有区别,但底层实现本质上是相同的。
以
inline
修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
const
和 enum
代替宏常量inline
代替宏函数 → 适合“小”函数inline
内联函数的特性:
auto
自动识别类型:
int a = 0;
auto b = a;
auto c = &a;
typedef char* ptr;
const ptr p1;(编译错误 typedef后实际上是: char* const p1;常量指针必须初始化;没有为什么,语法归档
const ptr* p2;//编译正常
范围for
——语法糖:对于一个有范围的集合,自动依次取其中的数据赋值给对象var
(var只是这个取得一个变量名),自动判断结束
int main()
{
int array[] = { 1, 2, 3, 4, 5 };
for (auto& var : array)
var *= 2;
for (auto num : array)
cout << num << " ";
输出结果:2 4 6 8 10
//这里的var和num都是变量名,两者一不一样或取什么名字都是不影响的
return 0;
}
简而言之,NULL在C++中出现了bug,所以引入 nullptr
nullptr
使用注意:
- 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入 的。
- 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
- 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。
END