简介:本课程是C++起航篇的延伸,讲述了引用、const、函数默认值、函数重载、内存管理等内容,最后通过一个通俗易懂的例子将所述知识点融会贯通,以达到知识灵活运用,最终得以升华的目的。

第1章 离港总动员

1-1 离港总动员(02:11)

  • 引用VS指针
  • #define VS const
  • 函数默认值&函数重载
  • 内存管理(在堆中的内存管理都是由程序员来管理,出来混总是要还的。)
  • 封装 继承 多态

    第2章 C++语言引用

    2-1 C++语言引用(08:12)

    &符号就是取地址符号, 含义只这么一个; *符号就是创建一个指针, 或者做一次地址跳转;
    在任何编程语言中, 其实一个变量都代表了一个内存上的地址.
    int a = 10, 给a分配一个内存逻辑地址0x1001ff, 这个地址存放了值10;
    int &b = a, 给b分配和a一样的逻辑地址0x1001ff. 因此b就是a的别名;

好了, 最难的来了.
int a = 10; // 给a分配一个内存逻辑地址0x100001, 这个地址存放了值10;
int p = &a; //创建变量p, 给p分配地址0x100002, 这个地址存放的值是”0x100001”(a的逻辑地址值);
int
&q = p; //创建变量q, 给q分配地址也是0x100002, 因此这个地址存放的值还是a的逻辑地址值;
*q = 20; //访问存放在q变量地址下的值, 获得了a的地址值, 再访问一下a的地址值, 修改上面的内容为20;

至此, 我觉得我基本解释清楚了&的作用机理, 它就是取地址; 而*的含义是做一次地址跳转;

【基本数据类型的引用】

[类型名] &[引用名]=[目标变量名];
/
例:
int a=3;
int &b=a; //引用必须初始化
/

变量的引用

引用是变量的别名
1 基本数据类型的引用
2 结构体类型的引用
3 指针类型的引用 ( 类型 &指针引用名=指针)(例:int a=10;int p=&a;int *&q=p;)
4 引用作函数参数
(例:
void fun(int &a,int &b)
{
int c=0;
c=a;
a=b;
b=c;
}

int x=10,y=20;
fun(x,y);

指针和引用的区别

指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;
而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。
简单点说:一个是存地址,一个是变量别名。

第3章 C++语言const关键字
3-1 C++语言-const(08:39)






一个比较好记的方法来区分 int const p与 int const p,把读作pointer to然后从后往前读.
第一个int const
p就可以读作 p is a pointer to const int,p是指向常量的指针
第二个int* const p就可以读作 p is a const pointer to int,p是指向int型的常指针

const指针主要看const修饰p还是p,修饰p不能改变p的指向(不能使p指向其他变量),修饰p不能改变p的值(即p指向的变量的值)。
int
const p;int const* p; 一种限制指针指向,一种限制指向的值。

编译器不允许一个非const指针指向一个const变量(否则可以通过指针对const变量的值进行修改,存在风险)

第4章 C++函数新亮点

4-1 [C++]函数特性(11:32)

  • 无实参则用默认值,否则实参覆盖默认值
  • 函数中有默认值的参数必须写在参数表的最右端
  • 函数重载(在相同作用域内),可以通过参数的个数和类型来把多个名字相同的函数区分开(一个函数是没有办法重载的)
  • 在声明函数的时候可以添加默认值,在函数实现的时候最好不要添加默认值,有些编译器无法通过。
  • 内联函数 inline 效率高 有条件(1.逻辑要简单【比如for,while循环就不行】2.不能是递归函数)

函数重载:在相同作用域内,用同一函数名定义的多个函数,参数个数和参数类型不同。
函数的重载(overload)和Java语言的函数重载一样, 函数名一致, 但是函数签名中的 返回值类型和参数是不一样的.
计算机对函数重载的区分法:

内联函数, 在函数签名之前要加上inline, 这样函数代码块会替换掉调用出的那行函数名, 这样减少了函数调用栈push和pop stack的开销.

为啥不什么地方都用inline呢? 首先, inline是建议性的, 由编译器决定具体是否替换代码(递归是坚决不会进行替换的); 其次, 内联函数只适合逻辑简单, 且调用频繁(不停的call这个函数), 如果内联函数中有for, while循环的话, 往往效果不好, 不如单独给其一个函数栈来使用. 最后, 递归函数是无法使用内联方式的.

第5章 C++内存管理

5-1 [C++]内存管理(06:31)

C语言和c++申请和释放内存
c 是malloc free
c++是new delete
申请内存 new运算符
释放内存 delete运算符




使用new申请内存,使用delete释放内存;
new与delete要配套使用;
申请内存需要判断是否成功,释放内存需要设空指针.

int *p = new int[1000];
delete []p;
p = NULL;