概述
来自高质量c/c++编程 第八章总结:
1.函数重载:
(1)c++引入函数重载目的:
a.第一个将功能相似的几个函数用同一个函数名表示,便于记忆提高了函数的易用性;
b.第二个是类的构造函数需要重载机制,因为构造函数只能有一个名字就是和其类名相同,如果想用几种不同的方法创建对象,只能用重载机制来实现;
(2)函数重载定义
同一作用域,函数名相同,参数列表不同(类型,个数,顺序),返回值不关注的几个函数
(3)函数重载如何实现的
重载函数时不同的而寒暑,依照参数来区分重载函数,编译器根据函数名+参数为每个函数产生不同的内部标识符,不同的编译器可能产生不同风格的内部标识符
注意:
1.一个全局函数和一个类成员函数如果是同名函数,则二者不构成重载,因为作用域不同,如果要在类中调用这个全局函数,函数调用时要加上要加上‘::’解析符
2.当心隐式类型转换导致重载函数产生二义性。如void output(int x);和void optput(float x);同时存在时output(0.5)调用将产生编译错误,因为编译器不知道将调用哪个函数,因为0.5隐式类型转换后既可以赋给int类型变量,也可以直接赋给float类型变量
2.函数重载、函数覆盖、函数隐藏
(1)函数重载:
函数重载又叫函数重命名,作用域相同、函数名相同,参数列表不同,返回值不关心的一组具有功能相似的函数。
(2)函数覆盖:
函数覆盖又叫函数函数重写,两个函数位于不同的作用域(基类和派生类),函数名相同,参数列表相同,返回值相同,基类函数必须有virtual关键字
(3)函数隐藏:
函数隐藏又叫函数重定义,两个函数位于不同的作用域(基类和派生类),派生类对基类的同名函数造成隐藏。
注意:
1.函数隐藏有时会引起麻烦(本来想调用基类的函数,但是会被派生类的同名函数隐藏,这时可以在派生类再一次定义这个函数,函数体里面指定调用这个基类函数)
2.处于基类与派生类中的两个同名函数,不构成覆盖就构成隐藏
3.函数缺省值
函数参数中的缺省值在程序编译时,缺省值由编译器自动插入
规则:
(1)参数缺省值只能出现在函数的声明中,不可出现在定义中(声明与定义分开时)
- 如果函数有多个参数,参数只能从后->前开始缺省
注意:
1.不合理的使用参数的缺省值将导致重载函数导致二义性(void output(int x); void output(int x, float y=0.0))
4.运算符重载
在c++语言中,可以用关键字operator加上运算符来表示函数,叫做运算符重载
注意:
1.如果运算符被重载为全局函数,那么只有一个参数的运算符叫做一元运算符,有两个参数的运算符叫做二元运算符
2.如果运算符被重载为类的成员函数,那么一元运算符没有参数,二元运算符只有一个参数,因为对象自己做了左边的参数
3.不能被重载的运算符(. .* sizeof :: ?:)
5.函数内联
c++语言支持内联函数,其目的是为了提高函数的执行效率(速度)
宏和内联是如何处理工作的?
宏:在预处理期间发生替换,没有类型安全检查。
内联:在调用一个内联函数时,编译器首先会进行类型安全检查,匹配到正确的内联函数,内联函数的代码会直接替换函数调用,省去函数调用开销。假设内联函数时成员函数的话,对象的this指针也会被放在合适地方可以访问类的私有成员,而宏在这点是做不到的。
注意:
1.尽量使用内联取代宏函数,宏本身不是函数,只是使用起来像函数,预处理器使用宏替换方式代替函数调用,省去参数压栈,返回等过程从而也提高了速度,但是宏最大的缺点是容易出错,一定要多上括号避免优先级问题;而且参数传递有副作用,不能调试,没有类型安全检查的缺点,此外宏无法操作类的私有数据成员。
2.关键字inline必须与函数定义体放在一起才能使函数称为内联,仅仅放在函数声明前是不起作用的。(不过最终还是要取决于编译器,关键字只是一个建议而已)
3.定义在类内的成员函数自动成为内联函数
4.内联函数既具有宏代码的效率,有增加了安全性,还可以调试,因此尽量用内联取代宏(assert()除外,assert()是仅在DeBug下起作用的宏,它用于检查不该发生的情况)
5.当函数体代码较长,如有循环递归不宜使用内联,否则引起“代码膨胀”
问题(1):如果c++程序要调用已经被编译后的c函数,该怎么办?
函数void foo(int x,int y);被c编译器编译后在库中的名字为_foo,而在c++编译器编译后在库中的名字为_foo_int_int来支持函数重载,由于编译后的名字不同,c++程序不能直接调用c函数。为了解决这个问题,c++提供了一个连接交换指定符号extern “C”,这告诉编译器,函数foo是个c连接,应该到库中找名字_foo的函数,而不是找_foo_int_int的函数。
最后
以上就是鲜艳毛衣为你收集整理的c++函数高级特性的全部内容,希望文章能够帮你解决c++函数高级特性所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复