(1)理解C++函数之间参数按值传递、按地址传递、按引用传递的差异;
在使用C++语言进行程序编写时,函数的调用是非常普遍的。函数的调用又可分为无参调用和有参调用,通常我们需要将一个或多个参数传递至函数内部进行相关的计算操作,这种调用方式就是有参调用。在C++语言中,有参调用的参数传递方式有值传递、引用传递以及指针(地址)传递三种,这三种传递方式有着很大的区别,且不同的传递方式对结果会产生不同的影响,深入理解和掌握这三种参数传递规则是学习C++编程必不可少的步骤。
具体地,在使用值传递时,形参和实参是两个独立的变量,各自在内存中拥有不同的内存空间,系统将实参的值进行拷贝然后赋值给形参,在被调函数中修改形参的值不会影响实参本身;使用引用传递时,形参是系统给实参起的一个别名,形参代表的就是实参本身,因而系统不会给形参再额外分配内存,并且在被调函数中修改形参的值将会改变实参本身;使用指针(地址)传递时,形参必须是指针变量类型,形参中存放的是实参的地址,通常也称该指针(地址)指向了实参,通过*运算符可以对指针中的内容进行操作,并且该操作将改变实参的值。
完成实验后,学生应能够快速区分这三种参数传递方式,了解它们之间的差异及其背后的原理,并在实际代码编写过程中熟练使用每种参数传递方法。
(2)理解C++函数之间参数传递的机制和顺序;
在函数调用时,系统首先会将被调函数加载到栈顶,然后从左到右依次检查被调函数的每一个参数项,并且依次对被调函数的形参进行初始化赋值。初始化赋值时,根据形参的数据类型不同,赋值方式也不同。对于值传递,系统会将实参的值进行拷贝,然后赋值给形参;对于引用传递,形参即代表实参本身,不再额外分配内存;对于地址传递,形参会使用实参的内存地址进行初始化赋值。
完成实验后,学生应了解被调函数函数加载的位置,掌握初始化形参变量时参数赋值的过程及其顺序,能够设计代码来验证形参初始化规则。
(3)理解C++函数中形参、局部变量在栈中的内存分配机制;
一个函数被调用时,系统会为其形参和局部变量分配内存,且这部分的内存分配将会发生在栈区。在栈区分配的内存都有其对应的作用域及寿命,作用域是指在哪一区域中该变量是有效的,寿命是指在什么时候该变量所分配的内存被系统回收掉。当一个变量不在其作用域中,那么对这个变量的任何操作都是非法的,一旦在超出其作用域的位置使用该变量,程序将会报错。此外,在一个变量的寿命结束之后,再次使用该变量也会使程序出错。因而,了解形参和局部变量在内存中的分配机制,有助于学生正确使用这些变量,避免编写的程序在该方面报错。
完成实验后,学生应熟悉函数中的形参和局部变量在内存中存放的方式,掌握形参和局部变量的作用域及其寿命。
(4)理解C++程序运行时的内存分配机制和原理;
C++程序在运行时内存分配方式可以分为静态内存分配和动态内存分配两种。这两种分配方式分配出的内存是有差别的,前者分配出的内存在栈区,而后者分配出的内存在堆区。在栈区分配的内存一般是临时的(main函数中分配的内存会在程序结束时回收),即其中某个函数或者变量寿命结束,系统会将其从栈中弹出并回收其占用的内存空间,这个过程不需要程序员自己干预。在堆中分配的内存会伴随程序直至结束,如果想要提前释放掉某块内存空间,则需要程序员编写一段释放该内存的代码,并且在释放结束之后,之前占用该内存的变量也不得再使用。特别是释放掉指针变量所指向的内存后,再次操作该指针变量是相当危险的!因为该内存释放后系统会将其分配给其他程序使用,那么再次对该指针进行操作可能会导致系统崩溃。
另外,静态内存分配和动态内存分配在代码层面的实现是不同的。最常规的直接定义某个变量使用的就是静态内存分配方式,该变量所占用的内存大小在程序运行过程中不会再发生改变(内存中的值可变),且不同的数据类型对应了不同的内存大小,这将由编译器自动计算完成。动态内存分配在C++中的实现需要使用关键词new(或者使用C语言的malloc函数),以这种方式分配出的内存在程序运行过程中是可变的,且这部分内存需要由程序员手动释放,如果没有及时释放,可能会导致系统内存耗尽。
完成实验后,学生应了解两种内存分配方式的特点,掌握每种分配方式其背后的原理,并且能够从原理出发阐述这两种内存分配方式的区别,最后还要能够在实际的代码编写过程中利用这两种分配方式来定义不同的变量。
Copyright © 2020-2030 版权所有:华中师范大学 鄂ICP备05003325号-9