学习近况
最近的大一下学期开学,我们开始学习C++的面向对象,老师说,C++特别是面向对象这里是最难的部分之一,所以我上课万万不敢走神打盹,可是人总是控制不住寄几,我上课还是一直走神,也不知道错过了一些什么东西,但是能记住的我都有好好的记在或是本子上或是课本上。
在前段时间的acm训练中,我因为实在不知道该写什么就提前把第三章的内容整理了一遍,没想到还需要再写一篇博客,就感觉很凉凉。
刚开始学习的时候,作业还不算很多,我仍旧可以留出很多时间来慢慢整理题目,可是随着进度的变快,以及内容的变多变难,我现在渐渐感觉有些吃力了。特别是上次的文件输入输出流,就算照着书上写也很难编译成功,更不要说打印到另一个文件中。然后最今又学习了类和对象,虽然上次也有用结构体,但是一想到周一又要重新默写一遍上次的代码,就感觉欲哭无泪。
废话不多说,还是开始整理博客把。
函数在大一上学期已经较为完整的整理过,所以这次就简单记一些还不能记住的内容。
1.函数传值
程序在执行过程中,会先为main分配一段栈空间,并为其中的未知量分配内存,当进行到函数所在的位置的时候,也会为我们自定义(或者系统、语言定义的函数分配空间),另外,编译器在处理函数调用的时候会从右到左进行压栈处理,简单来说,先调用最右边进行赋值,在依次向左。那么函数到底是怎样进行传值的呢?
众所周知,函数传值有三种方法:传值、传地址、传引用。我们来一一介绍。
(1)传值
也称作按值传递。是最简单也是最开始非常常用的传值方法,当函数处理不是太难,并且只需要一个值的返回时可以使用。这种按值传递是调用函数和被调用函数的一次交接,这种交接也是实现了程序控制权的交接,在这次交接之后,程序的控制权将交给被调用函数,只有执行完被调用或者碰到return时才会返回调用函数。
但是按值传递也有巨大的缺点,那就是当大型类对象或者结构体变量赋值时,会因为副本过大(因为按值传递相当于复制,在空间中再分配一段空间),时间空间的开销往往变大;第二,想要改变实参的值的时候按值传递是做不到的。
(2)传地址
相当于:int *p=&a;这样的赋值运算。左边是形参表中的样子,右边是实参表的数据类型。这样子的传参就会效率更高,占用内存相对较小。
但是传地址并不是那么安全,如果一不小心让指针指向了一个不安全的地址,那么可能造成无法预计的危险。
(3)传引用
相当于:int &r=a;同上方的传地址。因为引用只是起了一个别名,所以占用内存更小,并且更安全。
(4)额外的:数组参数
数组和函数必须使用地址来传参,没有例外。其中数组做参数是将数组第一个元素的地址传递。
如果在函数中使用数组长度,那么必须将他作为单独一个参数,例如:
void fool(int a[],char*size);
2.返回类型和return语句
①return语句放在函数体内,它将结束当前正在执行的函数,将控制权交给调用函数
②返回函数执行结果,可以是任意形式的表达式甚至函数的调用。
③默认按值传递时,将返回值交给某个副本(或者叫做临时对象),再赋值给调用函数中负责接收函数返回值的量。
另外一种较为难以理解的情况是返回引用。
在定义函数的时候加上&引用的符号即可以返回引用。到时候,返回的值将不再是一个临时变量副本,而就是返回的值本身(因为此时用的必须是引用)。
在函数执行结束后,所有的空间、变量都将被释放(销毁),所以我们不能返回局部的指针或者引用。
3.函数重载
表示一类名字相同、功能类似、参数不同(类型、个数)的函数,返回值倒是无所谓。C++的重载机制允许多个函数共享一个函数名,但是针对不同的参数类型进行不同的操作,因为编译器会根据参数类型自动选择。
注意,只有指针或者引用才能用const来区分。
4.参数作用域及存储
程序开始执行就会创建许多对象,这些对象有生也有死,这个周期就叫做生存期。对象的生存期与对象的作用域及存储类别密切相关。
(1)作用域
C++支持局部作用域、文件作用域、全局作用域、命名空间作用域和类作用域。这次我们只是简单了解其中一二(因为别的老师说现在我们这个阶段还不需要深刻了解)。
①局部作用域:每个函数都有一个局部作用域,块作用域也是局部作用域。
②全局作用域:不包含在任何函数中的作用域,整个函数都有一个全局作用域,定义在全局作用域的变量就叫做全局变量,空间更大,所以可以存储的内容更多。相应的,局部作用域的对象就叫做局部对象。
(2)对象
上方已经简单介绍了局部对象和全局对象。这里再深刻介绍一下局部对象的子对象
1.自动对象:
自动会被分配空间的局部对象就叫做自动对象,在函数结束的时候被抛弃。
2.静态对象:
静态对象作用域不大,但是生存周期比较长。将局部变量声明为static就可以了。这样每次退出函数静态对象的值仍被保存,但是不允许使用。
3.寄存器变量:
介绍不多,叫做register,优点是特别快,并且不需要内存地址。
(3)存储类别
静态分配:
一个固定的全局静态存储区,在程序执行的时候变量就占据存储空间,直到程序结束才释放内存。常见:全局对象、命名空间作用域对象、文件作用域对象、static和extern定义的对象、静态局部对象都是常见的的静态存储的对象
自动分配:
程序开始后开辟的一块名为栈的存储区。作用域开始时分配内存,结束后释放内存。自动局部对象、register对象都是局部存储的。
动态分配:
利用一个成为堆的内存块分配空间,程序员用new创建这样的对象,用delete结束这种对象的生存期。堆的特点是其中分配的对象没有名字,只能通过指针来操作这种对象。