一、引用
1.写法
类型名 & 引用名 = 某变量名;
int n = 4;
int & r = n; // r引用了n,r的类型是 int &
变量的引用完全等价与变量,变量更改引用也更改,引用更改变量也更改,引用又叫变量的别名。
2.注意事项
* 定义引用一定要将其初始化为引用某个变量。
* 引用从一而终,一旦初始化,始终引用第一次初始化的变量,不可更改。
(若其后程序出现 r = b,则为赋值关系,b=r=n)
(一个引用只对应一个变量,一个变量却可以有多个引用)
* 只能引用变量,不能引用常量和表达式。
3.引用的应用
(1)作为函数形参,实现通过修改形参改变实参。
void swap(int & a, int & b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
int main()
{
int n1,n2;
swap(n1,n2); //n1,n2作参数,无&,比指针更简洁
return 0;
}
(2)作为函数的返回值,实现对函数调用赋值
int n = 4;
int & SetValue()
{
return n;
}
int main()
{
SetValue() = 40; // 对函数的调用赋值,全局变量n变为40
cout << n;
return 0;
}
4.常引用
int n;
const int & r = n; // r的类型是 const int &
* 不能通过修改常引用修改引用的变量(通过直接修改变量改变引用内容)
* const T & 和 T & 是不同类型,可以用 T &初始化 const T &,反之只能进行强制类型转换
二、const 关键字
1.用法
(1)定义常量(define的上位代替)
const int MAX = 23; //不同于define 有类型,便于类型检查
const char * SCHOOL_NAME = "Peking University";
(2)定义常量指针(常用作函数参数,避免误改实参)
const int * p = &n;
* 不能通过常量指针修改它指向的内容
* 常量指针的指向可以变化
* 不能将常量指针赋值给非常量指针(除非强制类型转换,p2 = (int *)p1),反之可以
(3)定义常引用(见上)
三、动态内存分配(new运算符实现)
1.用法 (T:任意类型名。P:指针。N:分配元素个数,可以是整形表达式。)
(1)分配一个变量
P = new T; // P 是 T* 指针
(2)分配一个数组
P = new T[N]; //将N*sizeof(T)大小的内存空间起始地址赋给P
2.返回值类型
new T;
new T[N];
返回值为T*
int * p = new int;
3.delete释放动态分配的空间
delete 指针; // 指针指向new出来的空间
// 变量
int * p = new int;
* p = 5;
delete p;
delete p; // 错误!一片空间只能被delete一次
//数组
int * p = new int[20];
p[0] = 5;
delete [] p;