C++中的函数概念有哪些

发布时间:2022-04-11 10:26:49 作者:iii
来源:亿速云 阅读:200

这篇文章主要介绍“C++中的函数概念有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++中的函数概念有哪些”文章能帮助大家解决问题。

(一)函数使用规则

  1. 函数的定义不能嵌套但调用可以嵌套

  2. 在函数调用时,如某一默认参数要指明一个特定值,则有其之前所有参数都必须赋值

  3. 赋默认实参时 一旦某个形参被赋予了默认值,它后面的所有形参都必须有默认值,因为设置默认参数的顺序是自右向左;且注意默认值不可以是局部变量

  4. 函数参数的默认值可以是表达式

  5. 如果在函数定义时设置了默认参数,则就不能在函数声明时再次设置,反之亦然

  6. 函数只有一个 返回值,除void类型函数

  7. 函数调用可以出现在执行语句中,也可以出现在表达式中,甚至还可以作为一个函数的实参,但不可作为函数的形参,因为函数返回值存在寄存器中, 没有地址, 不能作为形参

  8. 函数是一种特殊的数据类型,正确

  9. 当函数不是void类型且函数体内没有return语句时,此时函数的返回值与返回类型相同但内容却是随机的一个值

  10. C++所有的函数本质上都是外部函数(可延申至其他文件中使用),故extern关键字可省略

  11. 如果函数的形参是指向普通变量的指针变量,实参只能用指向普通变量的指针,不能用指向const变量的指针,反之则都可以用

  12. 当函数自变量个数不确定时,系统不自动检测自变量

13. 函数三种传参:

① 值传递:会为形参重新分配内存空间 ,将实参的值拷贝给形参,形参的改变不会影响实参的值,函数被调用结束后,形参被释放。

② 地址的传递:形参为指针变量,将实参的地址传递给函数,可以在函数中改变实参的值。调用时为形参指针变量分配内存,结束时释放指针变量。

③ 引用传递:不会为形参重新分配内存空间,形参只是实参的别名,形参的改变只会影响实参的值,函数调用结束后,形参不会被释放。

(二)函数的使用

数组 —— 编译时分配的数组空间大小;
指针 —— 存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为 4 );
类型 —— 该类型所占的空间大小;
对象 —— 对象的实际占用空间大小;

函数 —— 函数的返回类型所占的空间大小。函数的返回类型不能是 void

Math.ceil() 表示向上取整,返回double类型

Math.round() 四舍五入,返回int类型

(三)预处理命令(包括宏定义)

(四)内联函数与宏的区别

(五)函数与宏的区别

(六)函数模板

1.函数模板的格式如下:

Template <class 形参名,class 形参名,......> 返回类型函数名(参数列表){函数体}

其中,class可以用typename关键字代替

① 因为很多时候,我们既需要一个模板能应对各种情形,又需要它对于某个特定的类型有着特别的处理,故出现了模板特化

① 特化整体上分为全特化和偏特化

② 全特化:就是模板中模板参数全被指定为确定的类型。 全特化也就是定义了一个全新的类型,全特化的类中的函数可以与模板类不一样

③ 偏特化:模板中的模板参数没有被全部确定,需要编译器在编译时进行确定

④ 对主版本模板类、全特化类、偏特化类的调用优先级从高到低进行排序是:全特化类>偏特化类>主版本模板类

⑤ 当函数调用发现有特化后的匹配函数时,会优先调用特化的函数,而不再通过函数模版来进行实例化

⑥ 模板特化相当于在声明了类模板等后声明需要模板特化然后让接下来的代码自己使用一个类型,故不能单独使用,例;![img](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps386C.tmp.jpg)

5. 模板特化实现:template<> + 完全和模板类型没有一点关系的类实现或者函数定义;

① 特化为绝对类型(全特化):例:template<>class Compare{...}; // 特化为float类型,此为函数模板特化;函数模板只能全特化,没有偏特化

② 特化为引用,指针类型(半特化、偏特化):例:template struct iterator_traits<_Tp*> {};

③ 特化为另外一个类模板(偏特化):例:template class Compare<vector>{};

(七)函数重载

(八)内联函数

1. 内联(置)函数inline:

引入内联函数的目的是为了解决程序中函数调用的效率问题;程序在编译器编译的时候,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体进行替换,而对于其他的函数,都是在运行时候才被替代。这其实就是个空间代价换时间的节省(弊:代码被多次复制,增加了代码量,占用更多的内存空间),故在当函数代码较小并且被频繁调用的时候。在使用内联函数时要留神:

① 使用基类指针或引用来调用虚函数时,它都不能为内联函数(因为调用发生在运行时)。但是,使用类的对象(不是指针或引用)来调用时,可以当做是内联,因为编译器在编译时确切知道对象是哪个类的

② 默认情况下,在类体中定义的成员函数若不包括循环等控制结构,符合内联函数要求时,C++会自动将它们作为内联函数处理(不是所有成员函数都是内联函数)

③ 内联函数在编译时是将该函数的目标代码插入每个调用该函数的地方,不是运行时

④ 内联函数在编译时做参数类型检查

⑤ 在内联函数中不允许使用循环语句(for,while)和switch结果,带有异常接口声明的函数也不能声明为内联函数。另外,递归函数(自己调用自己的函数)是不能被用来做内联函数的。内联函数只适合于只有1~5行的小函数

⑥ 内联函数的定义必须出现在内联函数第一次调用之前

⑦ 定义内联函数inline写类型前面

⑧ 关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用

⑨ 如果在类外定义inline函数,则必须将类定义和成员函数定义放在同一头文件中,否则编译时无法进行置换

⑩ 头文件中不仅要包含 inline 函数的声明,而且必须包含定义,且在定义时必须加上 inline

⑪ 不管是 class 声明中定义的 inline 函数,还是 class 实现中定义的 inline 函数,不存在优先不优先的问题

⑫ 内置函数不需要使用堆栈进行现场的保护与恢复

⑬ 用 inline 修饰的函数原型其对应的函数也将成为内联函数 - 错(自己理解:inline为建议型关键字)

⑭ 内联函数可以是静态的

关于“C++中的函数概念有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。

推荐阅读:
  1. Linux C++ 函数 基本概念(概览)
  2. C++中面向对象有哪些基本概念

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++

上一篇:vue+Element怎么实现登录随机验证码

下一篇:vue怎么实现公告消息横向无缝循环滚动

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》