时间:2022-10-09 17:53:19 | 浏览:1586
本篇要学习的内容和知识结构概览
传值:
传变量值: 将实参内存中的内容拷贝一份给形参, 两者是不同的两块内存
传地址值: 将实参所对应的内存空间的地址值给形参, 形参是一个指针, 指向实参所对应的内存空间
传引用:
形参是对实参的引用, 形参和实参是同一块内存空间
将实参对象的值传递给形参对象, 形参是实参的备份, 当在函数中改变形参的值时, 改变的是这个备份中的值, 不影响原来的值
像这样:
形参是对象指针, 实参是对象的地址值, 虽然参数传递方式仍然是传递方式, 因为形参和实参的地址值一样, 所以它们都指向同一块内存, 我们通过指针更改所指向的内存中的内容, 所以当在函数中通过形参改变内存中的值时, 改变的就是原来实参的值
像这样:
对于数组, 因数组名就是代表的数组首地址, 所以数组也能用传数组地址值的方式
在函数调用时, 实参对象名传给形参对象名, 形参对象名就成为实参对象名的别名. 实参对象和形参对象代表同一个对象, 所以改变形参对象的值就是改变实参对象的值
像这样:
优点: 引用对象不是一个独立的对象,不单独占内存单元, 而对象指针要另外开辟内存单元(内存中放实参传过来的地址),所以传引用比传指针更好用。
不要求程序在调用时必须设定该参数, 而由编译器在需要时给该参数赋默认值.
规则1:当程序需要传递特定值时需要显式的指明. 默认参数必须在函数原型中说明.
如果函数在main函数后面定义, 而在声明中设置默认参数, 在定义中不需要设置默认参数
像这样:
如果函数在main函数前面定义, 则在定义中设置默认参数
像这样:
规则2:默认参数可以多于一个,但必须放在参数序列的后部。
像这样:
可以有一个默认参数:void PrintValue(int a, int b, int c = 0);
可以是有多个默认参数:void PrintValue(int a, int b = 0, int c = 0);
不可以在中间设置默认参数:void PrintValue(int a, int b = 0, int c);
规则3:如果一个默认参数需要指定一个特定值时,则在此之前的所有参数都必须赋值
用const修饰要传递的参数, 该函数只能使用参数, 而无权修改参数, 以提高系统的自身安全.
像这样:
C++函数返回值类型可以是除数组和函数以外的任何类型
当返回值是指针或引用对象时, 需要注意函数返回值所指的对象必须存在, 因此不能将函数内部的局部对象作为函数返回值, 因为函数内, 局部变量或者对象在函数运行完毕后内存就释放了
函数可以返回一个引用, 目的是为了让该函数位于赋值运算符的左边
格式: 数据类型 & 函数名(参数列表);
像这样:
返回值是存储某种数据类型数据的内存地址, 这种函数称为指针函数
格式: 数据类型 * 函数名(参数列表);
像这样:
格式: 数据类型 函数名(参数列表);
像这样:
如果函数返回值作为另一个函数的参数, 那么这个返回值必须与另一个函数的参数类型一致
像这样:
使用关键字inline声明的函数称为内联函数, 内联函数必须在程序中第一次调用此函数的语句出现之前定义, 这样编译器才知道内联函数的函数虚, 然后进行替换
像这样:
在C++中, 除具有循环语句, switch语句的函数不能说明为内联函数外, 其它函数都可以说明为内联函数.
使用内联函数可以提高程序执行速度, 但如果函数体语句多, 则会增加程序代码量.
一个函数名具有多种功能, 具有多种形态, 称这种我为多态性, 一个名字, 多个函数
函数重载要满足的条件:
参数类型不同或者参数个数不同
像这样:
当函数重载与默认参数相结合时, 能够有效减少函数个数及形态, 缩减代码规模.
这样我们每种数据类型只保留一个函数即可完成我们的功能, 直接少了两个函数.
像这样:
如果使用默认参数, 就不能对参数个数少于默认个数的函数形态进行重载, 只能对于多于默认参数个数的函数形态进行重载.
像这样:
从而上面可以看出, 它们是逻辑功能完全一样的函数, 所提供的函数体也一样, 区别仅仅是数据类型不同, 为了统一的处理它们, 引入了函数模板.
现在我们的函数从4个缩减成一个, 但是我们的功能没有减少, 反而增加了. 比如我们可以计算char, float类型
在程序设计时没有使用实际存在的类型, 而是使用虚拟的参数参数, 故其灵活性得到加强.
当用实际的类型来实例化这种函数时, 就好像按照模板来制造新的函数一样, 所以称为函数模板
格式: 一般用T来标识类型参数, 也可以用其它的
Template <class T>
像这样:
当应用函数模板与具体的数据类型连用时, 就产生了模板函数, 又称为函数模板实例化
函数模板名<模板参数>(参数列表);
我们可以将参数列表的数据强制转换为指定的数据类型
像这样:int sumValue2 = sumWithValue<int>(3.2, 5.1);
我们将参数列表里的数据强制转换为int类型, 再参与计算
也可以样:double sumValue2 = sumWithValue(3.2, (double)5);
我们也可以将参数列表里的单个参数进行强制类型转换, 再参与计算
不过我们一般不会加上模板参数.
用途就是代替template参数列表中的关键字class
像这样
template <typename T>
只是将class替换为typename, 其它一样使用.
强烈建议大家使用typename, 因为它就是为模板服务的, 而class是在typename出现之前使用的, 它还有定义类的作用, 不直观, 也会在一些其它地方编译时报错.
总结:
可能对于初学者来说, 函数有点不是很好理解, 包括我当初也是, 不要想得过于复杂, 其实它就是一段有特定功能的代码, 只不过我们给这段代码起了个名字而已, 这样就会提高代码的可读性和易维护性。
自学C/C++编程难度很大,不妨和一些志同道合的小伙伴一起学习成长!
C语言C++编程学习交流圈子,关注+私信【C/C++编程】微信公众号:C语言编程学习基地
有一些源码和资料分享,欢迎转行也学习编程的伙伴,和大家一起交流成长会比自己琢磨更快哦!
首先高文个人见解是:兰溪因水运而兴,没有水运自然落后了。来自金华市交通局的消息,上世纪六七十年代建造的富春江船闸,成了兰溪港发展的束缚。当年一篇:《浩浩钱塘江,何日为我所用———兰溪港期待腾飞》。一石激起千层浪,读者反响强烈。那就让我们一起
作者 | Herb Sutter译者 | 弯月,责编 | 屠敏出品 | CSDN(ID:CSDNnews)C++20已全票通过,有望于今年晚些时候发布9月4日,C++ 20的国际标准草案投票结束,而且获得了全票通过。这意味着C++ 20已完
鱼竿是钓鱼人必不可少的装备,它的尺寸也是多种多样。每个钓鱼人手中的鱼竿数量肯定不少,野钓的,黑坑的,路亚的,筏钓的等等。买这么多的鱼竿我相信大家不是钱多,更多的是为了根据鱼情和水情来决定使用长短合适的鱼竿。其实最主要的目的是选择合适的鱼竿长
编辑:桃子【新智元导读】程序员「35岁定律」更像是圈内人的自嘲。近日,一位45岁程序员发帖称,「自己精通各种技术体系,却连个面试机会都没有」。据统计,不论是在国内还是国外,35岁以上的程序员占比最少,尤其在中国仅有9.4%。大龄码农真的如此
一个半小时的试听课结束后,儿子很兴奋,在课程销售的热情推介下,杭州的程芳(化名)刷了近3万元,给儿子报了两年半的编程课。“这是目前为止,给他报的最贵的兴趣班。”最近两年,在中小学生的课外培训市场上,少儿编程像一匹黑马冲了出来,日渐火热。上个
长江日报融媒体6月25日讯(记者陈智)对于非计算机专业的80后、90后来说,编程至今仍是能力范围以外的“技术活”,一串串代码只有程序员们能“驾驭”。但是,现在的不少00后已经可以熟练制作愤怒的小鸟,植物大战僵尸等小游戏。长江日报记者在百度上
青少年培训市场刮起了“编程热”,一如当年的少儿英语和奥数培训 少儿编程缘何成了资本的“香饽饽”?“时代真的不一样了,现在的孩子都开始学起了我在大学才开始接触的编程。”在重庆一软件开发公司上班的刘明看着手中刚刚拿到的宣传单感叹道,现在的培训机