C++复习day4:函数探幽(依据C++premier plus)

基于C++premier plus第八单元总结记录

 


一、C++内联函数

1.常规函数(跳转执行)和内联函数(用函数代码替换函数调用)之间的主要区别不再与编写方式,而在于c++编译器如何将他们组合到程序中

2.这是种空间(增加函数副本)换时间的做法,仅在执行代码短小且经常调用的情况下考虑。

3.使用方式为在定义或声明前加上关键词inline。形如inline double square(double x){return x;}

4.内联函数的使用要比c的宏方式更有效

 


二.引用变量

1.实质是创建已定义变量的别名。主要用作函数的形参,函数将使用原始数据而不是副本。

2.声明时的&可以表示假名引用的创建。形如int rats;int & rodents=rats;他们的变量名表示相同内存下的相同内容。

3.引用用作假名时必须在声明的同时进行初始化(用在形参里是视作被实参初始化)。

4.形参中引用则实参只可使用有地址的参数而不能用表达式

5.使用形参引用时,如果实参类型与形参不匹配,则只有形参定义为const时被允许,且此时实质上是生成了匿名变量让形参假名加标签而不是原变量。

6.引用主要用于结构或类对象这样的而非基本数据类型,使用方法相同

7.return语句默认返回的结构体还是个副本,需要返回本身的话需要在函数返回类型定义上加入&(不需要在return上修改)

8.注意不要返回会被清除掉的变量的引用(也即其地址)。

9.可以出现形如accumulate(duo,five)=four;的赋值语句,因为赋值语句仅要求左值标示一块内存,而此处的函数返回的是一块引用。被定义为const即失去作为左值的能力。

10.重申const的实参不可交付给非const的形参

11.由于string定义了转换方法,所以允许将c-风格字符串用作string对象的引用参数(形参引用const声明)

12.引用相关的继承特性:基类引用可以指向派生类对象。如ostream &可以指向其类对象cout或者其子类ofstream对象fout

13.何时使用引用参数(使用引用的原因):

(1)程序员希望改变调用函数的参数的内容

(2)通过传递引用而不是整个数据对象,可以提高程序的运行速度

(3)使用引用时多用const,安全的同时提高效率。

 


三、默认参数

通过在定义或声明的参数列表中为形参赋值达成。注意:     

(1)默认参数的赋值从右往左进行,且不可调用时空值跳过。

(2)调用时注意不要引发歧义。

 


四、函数重载

(1)即定义同名不同参(参数列表从编译器的角度来看不同)的方法

(2)也可以使用const做参数差异的标示

(3)const double &+double &=const double &&;更接近const double &

注: Foo&& foo2 = FooFactory();中&&标示右值引用,可以直接获取右边产生对象减少一次新对象生成

 


五、函数模板

(1)允许用任意类型来定义函数

template <typename Anytype>//指出要建立模板,并将类型自定义命名,必要关键字为template、typename(可用class代替)

然后把自定义类型Anytype当成数据类型正常使用并完成方法定义。

(2)使用时直接使用method(实参a,实参b);即可,模板自动根据实参类型生成相应的函数

(3)模板也是允许重载的

(4)优先调用非模板函数->调用显式具体化模板->调用通用模板(优先使用转换比较少的)

显式具体化形如template <> void swap<job> (job &j1,job & j2);含义是“不要用通用模板,而是使用为job类型定义的模板”

(5)编译器根据模板(本身不会生成函数定义,只是个方案)为特定类型调用时生成函数定义,称之为模板实例

(6)不允许被声明为同类的模板参数的不同类调用

(7)新增关键字decltype用于模板的声明参数类型,形如decltype(x+y) xpy=x+y;用该关键词表示变量xpy类型与x+y保持一致

(8)后置返回类型,常用于模板,形如auto h(int x,float y)->decltype(x+y)防止编译器先读返回值时参数未声明的问题

 


六、函数版本选择

1.流程:创建候选函数列表(根据函数名)->使用候选函数列表创建可行函数列表(根据参数)->确定是否有最佳可行函数

2.最优标准:完全匹配->提升转换->标准转换->自定义转换

3.函数模板的调用可手动提高到优先:即采用method<>()的方式调用,即告诉编译器使用模板函数

4.可强制转换模板调用参数的投入类型,即method<int>(a(double类型),b(float类型));此时会自动将a,b转换到int然后进行调用模板

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值