`

【c++ primer】第八章 函数探幽

 
阅读更多

一,C++内联函数

定义: inline double square (double x){return x*x;}//含有关键字inline的内联函数

描述:内联函数类似于宏的定义与调用

使用:调用内联函数时候,不用跳到另一个位置执行代码,而是将调用内联函数代码用相应内联函数替换。

区别:普通函数调用时候,跳到函数处执行完,返回再执行下一条语句。

内联函数调用时候,直接将代码复制过来执行,省去了跳过去然后返回的过程

宏:只是简单的形式上的替换

例:#define square(x) x*x

square(2+3)= 2+3*2+3;

内联函数:相当于调用函数代码

例:inline int square(int x){return x*x}

square(2+3)=5*5;

注意:内联函数不允许递归,内联函数不宜代码过长

二,引用变量

定义:引用是已定义的变量的别名,主要用作函数的形参。int &data代表 data是指向int的引用

用法:int a=3; int &b=a; //改变b 的值相当于改变a的值

注意:必须在声明引用的时候,初始化 int &a=data;类似于const指针

例子:

输出:
解释:rodents 是 rats的 引用,就是同名变量,存储在同一块地址。更改一个的值,同时更改两个变量。

三,引用用作函数参数

意义:使得函数中的变量名成为调用程序中的变量的别名(类似全局变量)

区别:c语言只能按值传递(使用调用程序中值的拷贝),也可以采用按指针传递

例子:

解释:void swaptp(int * a,int * b) //其实是将地址传递给函数,可以采用 int * p1,*p2;swaptp(p1,p2)或者int i,j; swaptp(&i,&j);

p1跟&i都代表地址,而 a也代表地址。所以应该传递进来地址。

相当于直接使用原地址操作,原来的数值

四,引用的属性和特别之处

引例:double refcube(double &ra){ra*=ra*ra; return ra; }//修改ra相当于修改 传递进来的值

常量引用:如果1,想让函数使用传递给他的信息。2,不对这些信息进行修改。3,想使用引用 使用常量引用(const double &ra)

注意:当数据比较大(结构,类)引用参数将很有用,避免复制占用的各种资源

临时变量产生的情况:1,实参类型正确但不是左值(可被引用的数据对象:变量,数组元素,结构成员,引用)

2,参数的类型不正确,但可以转换为正确类型

临时变量生存过程:只在函数调用期间存在,此后编译器将可以随便将其删除。

double side =3.0;

long edge=5L;

refcube(7.0);//类型正确,没有名称,生成临时变量

refcube(side+10.0);// 类型正确,没有名称,生成临时变量

refcube(edge);// 参数类型不正确

五,将引用用于结构

引例:

说明:返回值 是将返回的值复制到临时存储区域,随后调用程序访问该区域

返回引用 是调用程序直接访问返回值。跨过临时存储区域

注意:避免返回 当函数终止时不再存在得内存单元引用

应该避免示例:

const sysop & clone(sysop &sysopref)

{

sysop newquy;

newquy=sysopref;

return newquy;

}//函数结束时候 newquy 将被释放掉

如果想使用局部变量得引用,使用new分配新的内存区域:sysop newquy=new sysop;

六,将引用用于类对象

在C++中 "***"为const char * 类型,而string类定义了一种 char * 到string 的转换功能

七,何时使用引用参数

原因:1)程序员修改调用函数中的数据对象

2)传递引用,可以提高程序运行效率

八,默认参数

从右向左指定默认值 char * left(const char * str, int n=9)

调用时候 left("addf")

left("asdf",5) 都是合法调用

九,函数重载

可以使用相同函数名,不同的参数列表。参数列表是函数重载的关键

误区:1)引用跟变量 不算不同参数列表

print(char a)

print(char &a) //这两个不能共存

2)不同返回类型,相同参数列表不算重载

十,函数模板

定义:通用的函数描述

template <class Any> //定义模板类型

//template <template Any> //template 在新的编译器里面可以替换class

void swap(Any &a,Any &b)

{

Any temp;

temp=a;

a=b;

b=temp;

}

应用:如果将同一种算法,用于不同类型参数。使用模板

注意:函数模板不能缩短可执行程序,最终各个程序都会定义成各自独立的函数。而最终的源码不包含任何模板。

源码:

传递什么参数,Any 变成什么类型

十一,实例化和具体化

1)隐式实例化:函数模板并非函数定义,但使用int的模板实例是函数定义,是由于使用Swap()函数时提供了int 参数

2)显式实例化的格式:template 返回值类型 函数名<数据类型>(具体函数类型 形参);

例如:template void func<double>(double const&);

已经实例化的函数不能再次实例化

3)显式具体化:

假设定义了如下结构:
strut job
{
char name[40];
double salary;
int floor;
}
可以使用上面定义的模板函数进行两个job实例的交换功能,但是如果只想对结构中的部分成员进行交换(如salary和floor),则可以使用显式具体化。如下:
template <> void Swap<job> (job & , job &); //显式具体化函数定义

十二,编辑器如何选择函数版本

1)完全匹配,但常规函数由于模板函数

2)提升转换,参数列表char和short自动转换为int ,float转换为double

3) 标准转换,int转换为char long转换为double

4)用户定义的转换,类生命中定义的转换






分享到:
评论

相关推荐

    c++primer第五版习题答案(第17章)

    《C++ Primer》第五版是C++领域一本非常权威的教材,由Stanley B. Lippman、Josée Lajoie和Barbara E. Moo编著。该书是按照C++11标准编写的,它涵盖了C++语言的核心特性,包括数据类型、运算符、控制结构、函数、类...

    c++primer第五版习题答案(第18章)

    第18章作为《C++ Primer》全书的一部分,通常包含了该书中特定的专题。习题答案是指针对这一章节练习题的具体解答。这些练习题被设计用来加深读者对于章节内容的理解和应用,包含编程实践、问题解析、算法设计等多...

    C++Primer 第四版课后习题解答(第1~18章完整答案)完整版

    第八章“标准IO库”深入讲解了iostream库,包括输入输出流对象的使用、格式控制和错误处理。习题解答会涉及用户交互和文件输入输出。 第九章“顺序容器”介绍了std::vector、std::deque和std::list,讲解了它们的...

    C++Primer课后习题解答(第1~16章完整答案) 清晰 完整版

    8. C++编译过程:C++程序的编译过程通常包括预处理、编译、汇编和链接等多个步骤。在预处理阶段,处理程序中包含的头文件和宏定义。编译阶段将预处理后的代码转换为机器代码,汇编阶段将机器代码转换为汇编代码,...

    C++ Primer第四版【中文高清扫描版】.pdf

    《C++ Primer 第四版》是著名的C++编程语言教程,由Stanley B. Lippman、Josée Lajoie和Barbara E. Moo三位作者共同撰写。该书自出版以来,已成为广大程序员学习C++的必备书籍。第四版对前三版的内容进行了彻底的...

    C++primer第四版源代码

    《C++ Primer》第四版是C++编程领域的一本经典教材,由Lippman, Lajoie, and Moo三位作者合著。这本书深入浅出地介绍了C++语言的基础知识、中级概念以及高级特性,旨在帮助读者掌握现代C++编程技术。源代码文件包含...

    C++Primer(第4版)-课后习题答案.pdf

    8. 第八章标准IO库:介绍输入输出流,包括`iostream`库中的`cin`和`cout`,以及格式控制技巧。 9. 第九章顺序容器:讲解`std::vector`、`std::deque`、`std::list`等容器,它们的特性、操作和迭代器的使用。 10. ...

    C++Primer 习题解答(第4版)--绝对完整版

    8. **命名空间与链接**:C++ Primer 习题解答也会涉及命名空间的使用,避免全局名字冲突,并介绍静态库与动态库的链接问题。 9. **C++11及后续标准的新特性**:由于本书对应的是第四版,因此会包含C++11及其后续...

    c++ primer有目录pdf第五版本5th

    《C++ Primer》是有名的C++编程教材,其第五版(5th Edition)深入浅出地介绍了C++语言的基础知识以及C++11新标准的特性。这本书由Lippman、Lajoie和 Moo三位作者共同编写,是C++初学者和进阶者的重要参考书籍。 1....

    c++primer第五版习题答案(第12章)

    但是,我可以根据《C++ Primer》第五版的内容结构以及一般C++的学习顺序,为读者提供第12章可能涵盖的知识点,并对C++11标准中的相关概念进行介绍。 第12章通常会涉及C++中的输入输出库(I/O库),这是C++编程中必...

    c++primer plus第十章 代码

    《C++ Primer Plus》是C++编程领域里一本广受欢迎的教材,它的第十章主要讲解了C++中的类和对象,这是C++的核心概念之一。在这个章节中,你会接触到类的定义、对象的创建与使用、封装、继承、多态等关键知识点。现在...

    c++primer plus第七章到第十三章习题源码

    8. **模板(Templates)**:第十三章的习题可能涉及到模板,它是C++中的泛型编程工具,可以创建通用的函数和类。`template &lt;typename T&gt;`这样的语句表示模板的声明。 9. **异常处理(Exception Handling)**:异常...

    C++ Primer(第5版)_带书签_高清完整版

    8. **C++11新特性**:第五版涵盖了C++11标准引入的新特性和改进,如auto关键字简化类型推断、lambda表达式增强函数对象、右值引用和移动语义提升效率、nullptr替代NULL等。 9. **实践应用**:书中的例子和习题都...

    c++ primer 第5版 英文版 原版精美排版 mobi格式 kindle直读

    《C++ Primer》是C++编程领域的一本经典著作,第五版更是深受程序员喜爱的教程。这本书详尽地介绍了C++语言,从基础语法到高级特性,为读者提供了全面而深入的学习路径。作为英文版,它保持了原汁原味的专业表达,...

    C++Primer Plus附录源码等文件.zip

    《C++ Primer Plus》是Stephen Prata撰写的一本广受欢迎的C++编程教材,第六版提供了深入浅出的C++语言教程,旨在帮助初学者和有一定经验的程序员掌握这一强大的编程语言。附录中的源码文件是作者为配合书中的教学...

    C++primer第五版第二章习题答案.pdf

    C++primer第五版第二章习题答案.pdf

    C++ primer Query(15章第九节)

    《C++ Primer 5th 第15章第九节——深入查询操作》 在C++编程中,查询(Query)操作是程序设计中的一个重要环节,它涉及到如何从数据结构或数据库中检索特定信息。《C++ Primer 5th》是C++编程领域的经典教材,其第...

    C++Primer课后习题解答完整版.pdf

    1. C++基础语法与程序结构:文件提到了C++程序的基本结构,包括main函数的定义、输入输出流的使用、变量的声明、标准库头文件的包含等。例如,使用#include来包含标准输入输出流库,以及main函数的返回类型int。 2....

    C++ Primer Plus 第6版 中文版课后代码习题答案

    在《C++ Primer Plus 第6版》中,读者会学习到变量、数据类型、运算符、流程控制、函数等基本元素。 2. **类与对象**:C++的核心在于类的定义和对象的创建。类是一种数据结构,用于封装数据和操作数据的方法。对象...

Global site tag (gtag.js) - Google Analytics