引用
指针类型的引用
类型 *&指针引用名 = 指针;
结构体的引用
函数参数引用
const
int const *p = NULL;
const int *p = NULL; //和上一句等价
int x = 3;
const int *p = &x; //此时不能通过*p修改x的值(可以用p = &y)
int x = 3;
int *const p = &x; //此时不能使用p来修改x的值
int x = 3;
const int &y = x; //y是x的引用,即x的别名。
x=10; //可以修改x的值,y=20错误,y作为x的别名是const不可变的
定义两个int x和y,再定义int const p和int const p都 = &x,此时p和pp的值都为x的地址。用p=&y修改p的值为y的地址,用pp=y修改pp的值(即修改x的值)。此时,p的值为y的地址,p的值即y的值;pp的值为x的地址,x的值已被pp = y修改为y的值。
函数形参的const
没有const修饰的时候,形参的改变影响了实参的值。
有const修饰,编译器会报错,无法修改只读参数a,b的值。
函数特性
函数默认参数,必须在参数表的最右侧,无实参则使用默认值,否则实参覆盖默认值:
void fun(int i, int j = 10, int k = 5); //声明函数时,给了默认值
void fun(int i, int j, int k) //定义函数时,不要写默认值,不同编译器会有报错
{
cout << i << j << k;
}
内联函数
编译时将函数体代码和实参代替函数调用语句,减少了调用的步骤(尤其在循环体内会减少时间)
定义函数的时候用inline关键字
内联编译是建议性的:由编译器决定;
逻辑简单,调用频繁的函数,建议使用内联函数;
递归函数无法使用内联函数
内存管理
内存的申请和释放
new、delete(运算符)
申请内存: int *p = new int;
释放内存: delete p; p = NULL;
申请释放 块内存
int *arr = new int[10]; //申请了10个整型的块内存
delete []arr; //释放块内存
申请内存需要注意判断分配是否成功:
int *p = new int[1000];
if(NULL == p){
//内存分配失败;
}
释放内存需要注意:
int *p = new int;
if(NULL == p){
//内存分配失败;
}
delete p;
p = NULL; //释放内存之后,将p指向NULL
int *p = new int[1000];
if(NULL == p){
//内存分配失败
}
delete []p;
p = NULL; //delete之后将p指向NULL,以防出错
delete []p;
p = NULL;
申请内存需要判断是否成功,释放内存需要设空指针