C++ 缺省参数 函数重载 引用

缺省参数

在C语言中若函数定义了参数在调用函数时必须传递参数否则编译器会报错。C++对此进行改进,在定义或声明函数时可以给参数定义一个默认值,若定义和声明分离两者不能都对缺省值进行定义,这时需要在声明时定义,因为在编译阶段会寻找对应函数,这时若声明的函数的参数对应不上会报错。

缺省参数的定义可以是半缺省例如这里我i是可以不提供缺省值只给k提供,但是不能给i提供不给k提供,缺省参数的定义需要从右向左,函数传参时若时只给一个参数的时候会优先给i,所以若只给了i则k就没有参数了无法匹配函数。且缺省参数必须是常数或者全局变量,不然无法访问。

函数重载

在C++中是支持同名函数的,在C++中对同名函数的区分就依靠参数数量不同或者类型不同区分,这些同名函数就构成函数重载的概念。

函数重载必须是参数数量不同或者类型不同,只需要有一个参数不同便能构成函数重载

原理:调用函数一般是在编译阶段会通过函数的名字去在函数列表中找到对应的函数的地址,在运行时再将参数传递到这个地址的变量内存中在执行函数

这个是两个int参数的test函数。

这是三个参数的。

这是两个double类型的。

如图,C++编译器对参数的名字进行了修饰在函数名后加上的对应的每一个参数的类型。这个修饰在每个编译器中不一定都一样的但是都是会进行一些修饰以确定对应函数。

引用

C++新增的引用概念就对C语言中的指针进行一些改变,在大部分场景引用可以替代指针的使用,但是一些特殊的场景中指针还是不可替代的,引用的实现用的实际也是指针。引用的关键字是&。

引用也可以当作给变量或者函数取别名,我们定义一个变量时需要定义它的类型和名字,在通过名字来找到对应的内存空间使用或者修改其中的数据。引用就是对这个空间再取另外一个名字,这时候两个名字所代表的是同一块空间,两个名字都能访问或者修改这个空间内的数值。

如图,我们无论对i还是j的修改都会影响到另外一个,因为两个指的是同一块空间。

引用在定义的时候就必须初始化,毕竟我们不能先定义了别名再找一个人对应,都得先有的主体才会有别名。一个别名只能指定一块空间,这里j指定了i对应的空间就不能再指定另外的空间了,不过一个空间能拥有多个别名这个数量没有限制。

常引用

上面是对变量的引用,若我们对常量的引用

图中k变量这样子是不行的,常量是存储在常量区,这个区间的数据是不能被修改的,但是正常的引用对数据是有修改权限的,这样子定义编译器会直接报错不能通过。但是我们能通过常量修饰符const对引用进行修饰就可以。

这里其实是一个权限的放大缩小的问题,在程序中权限的变更只能缩小是不能放大的,在常量区的数据都是只读数据,不能写,若是使用正常引用的话这里的数据就会从只读权限变为可读可写。

类型的转换引用:我们赋值的时候可以将一个浮点型数据赋给一个整形的变量,那么引用是否可以将一个浮点型的变量取一个整形的别名呢。

这里编译器报错了,是指这是一个无效的初始化,后面跟着类型int&和float作为参考。

当我们将引用改为常引用的话这个程序就能编译通过并正常运行了。回到赋值上当我们将一个浮点型的数据赋给整形变量它实际是怎样进行提升的呢,它会对数据进行截断如1.2会变成1,那么这个1.2改变了吗,并没有,所以我们可以得知截断后的数据会在一个空间内保存然后再赋值给变量,这个保存数据的空间其实就是常量区因为这个1就是一个常量,引用同理,我们不能对一个常量区的空间进行正常引用所以加上const修饰后就可以了。

引用一般用于函数的参数传递,这样函数就不需要进行参数的拷贝而创建临时空间并且能修改其数值而不需要传地址使用指针接收了,还可以作为函数的返回值返回一个变量或者函数的引用以变再次调用。

如图我们看到引用再实现上也是按照指针一样实现的,都需要额外开辟空间。

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-06-10 20:30:05       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-10 20:30:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-10 20:30:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-10 20:30:05       18 阅读

热门阅读

  1. cell的复用机制和自定义cell

    2024-06-10 20:30:05       12 阅读
  2. Python 函数

    2024-06-10 20:30:05       10 阅读
  3. python

    2024-06-10 20:30:05       12 阅读
  4. PostgreSQL的发布和订阅功能

    2024-06-10 20:30:05       12 阅读
  5. 每日一题38:数据分组之订单最多的客户

    2024-06-10 20:30:05       8 阅读
  6. Ubuntu中安装MySQL root 密码修改

    2024-06-10 20:30:05       7 阅读
  7. 心灵清闲

    2024-06-10 20:30:05       10 阅读
  8. 深入解析分布式链路追踪:原理、技术及应用

    2024-06-10 20:30:05       11 阅读
  9. electron录制工具-desktopCapturer录屏

    2024-06-10 20:30:05       10 阅读
  10. multisim仿真电路图

    2024-06-10 20:30:05       11 阅读