1、引用类型(引用是变量的别名)
(1)基本数据类型的引用
#include<iostream>
using namespace std;
int main<void>
{
int a=3;
int &b=a;//引用必须初始化
b=10;//a的值也变了
cout<<a<<endl;
return 0;
}
(2)、结构体类型的引用
#include<iostream>
using namespace std
typedef struct
{
int x;
int y;
}Coor;
int main(void)
{
Coor c1;
Coor &c=c1;
c.x=10;
c.y=20;
cout<<c1.x<<c1.y;
return 0;
}
(3)、指针类型的引用
类型 *&指针引用名=指针;
#include<iostream>
using namespace std;
int main(void)
{
int a=10;
int *p=&a;
int *&q=p;
*q=20;
cout<<a<<endl;
return 0;
}
(4)、引用做函数参数
void fun(int &a,int &b)//a,b为别名
{
int c=0;
c=a;
a=b;
b=c;
}
int x=10,y=20;
fun(x,y);
2、控制变化的const
(1)、const与基本数据类型
int x=3; //变量
变量名 存储地址 存储内容
x &x 3
const int x=3; //常量,x的值无法更改
变量名 存储地址 存储内容
x &x 3
(2)const与指针类型
const int *p=NULL;
int const *p=NULL;///与上一个两者完全等价
int *const p=NULL;
const int *const p=NULL;
int const *const p=NULL;///与上一个两者完全等价
eg .int x=3; const int *p=&x;//p=&y;正确//*p=4;错误
变量名 存储地址 存储内容/*指存储内容&指存储地址
x &x 3
p &p &x
eg .int x=3; int *const p=&x;//p=&y;错误
(3)、const与引用
eg int x=3; const int &y=x;//x=10正确//y=20;错误
const int x=3;; int *y=&x;错误
int x=3; const int *y=&x;正确
3、函数新特性
(1)函数参数默认值
void fun(int i,int j=5,int k=10)
void fun (int i,int j=5,int k);//错误
有默认参数值的参数必须在参数表的最右端
void fun(int i,int j=5,int k=10);
void fun(int i,int j,int k)//定义时不用带参,因为可能会导致编译不通过
{
cout<<i<<j<<k;
}
int main()
{
fun(20);
fun(20,30);
fun(20,30,40);//无实参则用默认值,否则实参覆盖默认值;
return 0;
}
(2)函数重载
在相同作用域内用同一函数名定义的多个函数 参数个数和参数类型不同
int getmax(int x,int y,int z)//电脑编译后会生成getmax_int_int _int函数
{
}
double getmax(double x,double y)//电脑编译后会生成getmax_double_double
{
}
(3)内联函数 inline
编译时将函数体代码和实参代替函数调用函数,节省运行时间
但是内联函数是建议性的,由编译器决定
逻辑简单,调用频繁的函数建议使用内联。(不含循环)
递归函数无法使用内联方式
inline int max (int a,int b,int c)
int main()
{
m=max(i,j,k);
}
(4)内存管理:申请/归还内存资源
申请内存 new(运算符)eg int*p=new
释放内存 delete(运算符)eg delete p
int *arr=new int[10];//申请块内存
delete [ ]arr;//释放块内存
注意事项:申请内存不一定成功,申请内存需要判断是否成功,释放内存需要设空指针
int *p=new int[1000]; // int *p=new int;
if(NULL==p)
{
//内存分配失败
}
delete [ ]p; //delete p;
p=NULL;