函数等最近C++学习总结

学习近况

最近的大一下学期开学,我们开始学习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结束这种对象的生存期。堆的特点是其中分配的对象没有名字,只能通过指针来操作这种对象。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值