Fork me on GitHub

C++-离港篇


const

const关键字与指针类型

1
2
const int *p = NULL;
int const *p = NULL;

这两种写法是完全等价的,const修饰的是*p

1
int * const p = NULL;

const修饰的是p

1
2
const int * const p = NULL;
int const * const p = NULL;

这两种以此类推也是等价的写法

举例1:

1
2
3
4
5
int x = 3;
const int *p = &x;

// p = &y; 正确
// *p = 4; 错误

因为const修饰的是*p,而不是p,所以*p是常量,不能被改变

举例2:

1
2
3
4
int x = 3;
int *const p = &x;
// p = &y; 错误
// *p = 4; 正确

因为const修饰的是p,而不是*p,则p是常量,不能被修改

const关键字与引用&类型

1
2
3
4
int x = 3;
const int &y = x;
// x = 10; 正确
// y = 20; 错误

const修饰的是&y,则y是常量,不能被修改

ps: const int x = 3; int *y = &x;在计算机中被禁止,因为可以通过一个可变的指针可以修改x的内容,但x又是不可更改的,所以风险太大,计算机禁止;

函数新特性

函数参数默认值

1
2
3
void fun(int i,int j = 5,int k = 10);

void fun(int i,int j = 5,int k); // 错误
有默认参数值的参数必须在参数表的最右端

函数重载

在相同作用域内,用同一个函数名定义的多个函数,(参数个数或者参数类型不同)

1
2
3
4
5
6
7
8
9
int getMax(int x,int y,int z)
{
// to do
}

int getMax(double x,double y)
{
// to do
}

在编译的时候呢

1
2
getMax_int_int_int
getMax_double_double

内联函数

在定义的时候与普通函数没有什么不同,主要是调用的时候不同。

内联函数:在编译的时候,将函数体代码和实参代替函数调用语句,省去列调用时间和恢复现场的时间。尤其是循环调用的时候将节省更多的时间;

1
inline int max(int a,int b,int c);

内联声明只是建议计算机用内联形式,但如果用inline声明递归函数将不是内联函数。

内存管理

内存的申请和释放

1
2
3
int *p = new int;

delete p;
1
2
3
int *arr = new int[10]; // 申请内存块

delete []arr; // 释放内存块

补充:C语言中的内存管理

1
2
3
void *malloc(size_t size);

void free(void *memblock);

注意申请内存时,要进行判断是否申请成功,因为操作系统此时不一定有足够的内存。

最后释放完内存之后,要将指针指向NULL

1
2
3
4
5
6
7
8
int *p = new int;
if(NULL == p)
{
// 内存分配失败
// 异常处理
}
delete p;
p = NULL;
坚持原创技术分享,您的支持将鼓励我继续创作
-------------本文结束感谢您的阅读-------------
0%