C++新增了bool类型。
const使用对比1,修饰 指针/常量 对比:
//1和2等价 const int *p = NULL;// p是指针,const对指针进行修饰,将限制通过指针修改p指向的数据;故不能通过此指针修改其指向的数据的值。 int const *p = NULL; int * const p = NULL;// p是常量,然后int *将常量修饰为指针,则整体为指针常量;故不能修改指向。const使用对比2:
// 完全等价 const int * const p = NULL; int const * const p = NULL; // 示例1 const int x = 3; const int * const p = &x;// int * const p是常量指针,指向const int这个整型常量 p = &y;// 错误 *p = 4;// 错误 x = 5;// 错误 // 示例2 int x = 3;// 这里不用const修饰 const int * const p = &x; p = &y;// 错误 *p = 4;// 错误 x = 5;// 正确 // 引用也是一样的情况,如果x不用const修饰,则直接通过x修改是可以的。在声明变量和其指针时,const的使用:
// 错误1,无法通过编译 const int x = 3; int *y = &x; // 正确1 int x = 3; const int *y = &x; // 正确2 const int x = 3; const int *y = &x;我们也可以用权限范围对此进行理解:
在const使用对比1,对比2 的代码注释中有写对const和*修饰的作用,。
我们先看上方正确1 的代码,我们可以直接使用x进行写、读操作(修改/获取数据),但是y因为有const修饰,所以只能通过y进行读操作(获取数据)。显然,x的权限范围 大于 y的权限范围,所以这里可以将&x赋给y。
再来看正确2 ,x只能进行读操作,y也只能进行读操作,x的权限范围 等于 y的权限范围,所以这里也是正确的。
最后看错误1 的代码,x只能进行读操作,但y能进行读、写操作。x的权限范围 小于 y的权限范围,所以&x是无法赋给y的,故这种写法一定是错误的。
函数的参数列表:
// 正确 void fun(int i, int j = 5, int k = 10); // 错误,k没有默认值,不应该放在最右边 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; }注意:在声明中写默认值即可,如果写在定义中,有的编译器可能会无法通过。
在相同作用域内,用同一个函数名定义的多个函数,参数个数和参数类型不同。
效率高,适合频繁调用的函数,不过有条件。
要求逻辑简单(不能有for等循环体)、不能是递归函数。
对编译器来说inline是建议性的,是否编译成内联函数还是由编译器根据情况决定的。
故,内联可以说只是一种编译的方式。
和C语言对比:
// C void *malloc(size_t size); void free(void *memblock); // C++ int *p = new int; delete p;注:new、delete是运算符。
块内存操作:
int *arr = new int[10]; delect []arr;[重要]内存分配有失败的风险,所以需要验证:
int *p = new int[1000]; if(NULL == p){ // 内存分配失败 }[重要]内存释放完毕,也需要将指针指向NULL,绝对不要留下野指针:
// 1.内存申请和释放 int *p = new int; if(NULL == p){ // 内存分配失败 // 异常处理 } delete p; p = NULL;// 务必这样做! // 2.块内存申请和释放 int *p = new int[1000]; if(NULL == p){ // 内存分配失败 // 异常处理 } delete []p; p = NULL;// 务必这样做!获取数组元素个数:
// C++中没有现成的获取数组元素个数的方法,只有自己写。 int count = sizeof(array) / sizeof(array[0]);本篇为视频教程笔记,视频如下:
C++远征之起航篇
C++远征之离港篇