离港篇
引用
引用是变量的别名
引用不能单独存在
基本数据类型的引用:
int x = 2;
int &b = x;
b = 10;
cout << x << endl; // 10
结构体类型的引用
typedef struct{
int x;
int y;
}Coor;
Coor c1;
Coor &c = c1;
c.x = 10;
c.y = 20;
cout << c1.x << c1.y; // 10 20
指针类型的引用
类型 *&指针引用名 = 指针;
int a = 10;
int *p = &a;
int *&q = p;
*q = 20;
cout << a << endl;
// 20
引用作函数参数
void fun(int &a,int &b)
{
int c = 0;
c = a;
a = b;
b = c;
}
int x = 10,y = 20;
fun(x,y);
const
int x = 3; //变量
变量名 | 存储地址 | 存储内容 |
---|---|---|
x | &x | 3 |
const int x = 3; // 常量
const 与 指针类型
const int *p = NULL;
int const *p = NULL;
// 上两者完全等价
int * const p = NULL; // 此形式不同
// const 还可以加两次:
const int * const p = NULL;
int const * const p = NULL;
// 上两者完全等价
int x = 3;
const int *p = &x;
p = &y; // 正确
*p = 4; // 错误
因为 const 修饰 *p,所以 *p 不可变
特殊记忆法:
一个比较好记的方法来区分 int const p与 int const p,把*读作pointer to然后从后往前读。
第一个int const *p就可以读作 p is a pointer to const int,p是指向常量的指针
第二个int* const p就可以读作 p is a const pointer to int,p是指向int型的常指针
int const * p 指 p 的指向可以变,但是 p 的指向的那个值的内容不能变
int * const p 指 p 的指向不可以变,但是 p 的指向的那个值的内容可变
const 与 引用
int x = 3;
const int &y = x;
x = 10; // 正确
y = 20; // 错误
C++ 函数新特性
函数参数默认值
void fun(int i,int j=5,int k=10);
// 在定义时不建议加上默认值,在声明时加
void fun(int i,int j,int k) {
cout << i << j << k;
}
有默认值的参数必须在参数表的最右端
函数重载
在相同作用域内,名称相同参数可辨
用同一函数名定义的多个函数,
参数个数和参数类型不同。
int getMax(int x,int y,int z)
{
// to do
}
double getMax(double x,double y)
{
// to do
}
如何实现重载?如上两个函数在编译后会变成
getMax_int_int_int
和 getMax_double_double
来区分两个同名函数
内联函数
编译时将函数体代码和实参代替函数调用语句,执行效率高
内联函数关键字:inline
inline int getMax(int i,int j,int k);
内联编译是建议性的,由编译器决定
逻辑简单(甚至不能还有 循环),调用频繁的函数建议使用内联
递归函数无法使用内联方式
C++内存管理
内存的本质:资源
操作系统掌控内存资源
我们只能 申请/归还 内存资源
申请/归还 内存资源就是内存管理
运算符:
- 申请内存 new
- 释放内存 delete
内存的申请和释放
申请内存:
int *p = new int;
释放内存:
delete p;
块内存的申请和释放
int *arr = new int[10];
delete []arr;
内存操作注意事项
申请内存不一定能申请成功:
int *p = new int[1000];
if(NULL == p) {
// 内存分配失败
}
释放内存注意事项:
delete p; 或 delete[] p;
p = NULL;