格式: 类型名 & 引用名=某变量名;
例如 int a=1; int & a1=a;此时a1的类型为 int &,a1等价于a.
注意:1引用只能引用变量,不能引用常量和表达式;
2引用的定义与初始化要同步进行,例如int & a1;这是编译错误的;
3引用初始化后只能一直引用该变量,不可以引用其他变量.但是一个变量可以有多个引用,多个引用时同时注意类型名要一致.
引用的应用:
1例如交换函数swap:
void swap(int a,int b){
int t;
t=a;a=b;b=t;
}
这段代码是起不到交换作用的,因为这个的形参是无法改变实参.但是,我们利用好引用,即可实现 ,如:
void swap(int & a,int & b){
int t;
t=a;a=b;b=t;
}
swap(n1,n2);
这时,形参类型为int &,函数调用后形参a就等价于n1,故可以实现.
2引用作为函数的返回值(候补)
例如:
int a=1;
const int & a1=a;
a1的类型为const int &.
注意,被常引用(如上a1)引用的的变量(如上a)不可以被该常引用(如上a1)去修改,a是可以自由修改的,a1可读不可自由该.
例如: 在加一句a1=2;这是编译错误, a=2;是可以的,并且a1也变成了2.
常引用与非常引用:
const int & 与int & 为不同的类型,int & 类型的变量可以初始化const int &的变量,反过来初始化则需要强制类型转换(通俗理解为,加上const该变量就比不加时"地位变低",只能被别人赋值,不能主动赋值别人).即:
int a;
const int & a1=a;
int & b=a1;
//错误,a1要写成 int & b=(int &)a1;
int a;
int & a1=a;
const int & b1=a1;;
//正确.
和define作用一样,例如 const int MAX=10000;
const T * p= n;
注意:
1不可以通过常量指针修改其指向的内容,但是常量指针的指向可以变化.
int a=1,b=1;
const int* p=&a;//"&"为取地址符,p为常量指针
*p=2;//编译错误
p=&b;//正确
a=2;//正确
2非常量指针可以赋值给常量指针,反之需要强制类型转换.(类似常引用)
3常量指针用于函数形参时,可以保护调用传递来的实参不被改变.
1分配变量:例如: p = new int; 其中,p是类型为int* 的指针,int也可以改为其他类型.该语句分配出一个大小为sizeof(int)字节的内存空间,并将该内存空间的起始地址赋值给指针p.
2分配数组:例如: p = new int [n];其中,p为类型为int* 的指针,该语句分配出一个大小为sizeof(int[n])字节的内存空间,并将该内存空间的起始地址赋值给指针p.
用new分配的内存空间,一定要用delete去释放.例如: p =new int后要delete p;
若为分配数组需要释放空间,delete [] p;
函数调用是要花费时间的,内联函数是将整个函数代码插入到调用的地方,减少了函数调用所需要的时间.例如:inline int swap(int a,int b){....}在函数定义前加上关键字inline.(具体候补)
多个函数具有相同的函数名,但函数之间有不同的参数个数和参数类型,(函数的返回值类型需要相同)这叫函数的重载(候补)
举例:
int max(int a,int b=1,int c=2){
...
}
//定义过程中可以让函数形参最右侧连续有初始值
调用:
max(10)//a==10,b==1,c==2;
max(10,3)//a==10,b==3,c==2
max(10, ,3)//不可以