一、内联函数

1、优点:

内联函数就是比较省资源,然后一般就是将简短,使用频率高的函数作为内联函数会比较合适。

2、一个demo

#include "stdafx.h"
#include<iostream> using namespace std; inline double Square(double x) { return x*x; } int _tmain(int argc, _TCHAR* argv[])
{
int a = 16;
cout << Square(334);
}

二、引用变量(别名)

1、创建引用变量

C和C++使用“&”符号来表示指示变量的地址。但C++中“&”还表示声明引用

int rat;
int &copy = rat;

声明引用变量的时候必须进行初始化,一定要的。

2、将引用用作函数的形参

直接将实参和形参进行关联起来,即类似于同一个人的不同名字。所以进行对形参的修改会导致实参一样跟着变化,因为两者本就是一体。

3、尽可能使用const

4、将引用作用于结构

// Exercise.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include<iostream> using namespace std; struct sysop
{
char name[26];
char quote[64];
int used;
}; const sysop & use(sysop & sysopref); int _tmain(int argc, _TCHAR* argv[])
{
sysop looper =
{
"Rick \"Fortran\" Lopper",
"I'm a goto kind of guy.",
0
}; use(looper);
cout << "Looper:" << looper.used << " use(s)\n"; sysop copycat;
copycat = use(looper);
cout << "Looper:" << looper.used << " use(s)\n"; cout << "use(looper):" << use(looper).used << " use(s)\n";//可以直接使用函数的返回值的结构体内的成员 return 0;
} const sysop & use(sysop & sysopref) //返回值是一个引用,可以节约赋值的时间(不用再开辟临时变量)
{
cout << sysopref.name << endl;
cout << sysopref.quote << endl;
sysopref.used++;
return sysopref;
}

一般返回值要加上const,这样子才不会修改返回值。例如下列情况。

use(looper).used=10;

不应该返回函数终止时不再存在的内存单元的引用,例如

const sysop & clone(sysop & sysopref)
{
sysop newguy;
newguy = sysopref;
return newguy;
}

即在函数内声明的引用不可以作为返回值。

三、默认参数

1、定义:

默认参数指的是当函数调用中省略了实参时自动使用的一个值。

2、设置方法:

在声明函数的时候赋值:

char *left(const char *str , int n=1);

一些规则:

(1)必须从右往左添加默认值,也就是说要为某个参数设置默认值,则,其右边的参数一定也设置了默认值、

(2)实参必须从左往右一次被赋予相应的形参,不能跳过任何的参数。

四、函数重载

1、定义:

同样的函数名称具有不同的函数功能。

2、实现方法:

对于同样名称的函数,则需要有特征量进行区分,所以特征量即为形参的个数和类型

一些规则

(1)相同的类型的引用和非引用变量是同一中特征。

(2)匹配函数时,并不区分const和非const变量。

(3)返回值类型不作为特征量

五、函数模板

1、定义:

同样的函数,只是参数的类型不同,所以制定一个函数的模板。

2、设置方法:

template <typename Any>   //template可以替换为class
void Swap(Any &a, Any &b)
{
Any temp;
temp = a;
a = b;
b = temp;
}

3、重载的模板

template <class Any>
void Swap(Any &a, Any &b); template <class Any>
void Swap(Any a[],Any b[],int m);

4、显示具体化

假如定义以下的结构:

struct job
{
char name[20];
double salary;
int floor;
}

假如希望能够交换其中的salary和floor成员,而不交换两个变量的name成员。我们可以通过显示具体化来实现:

(1)相关规则

(2)一个demo

void Swap(job &,job &);

template <class Any>
void Swap(Any &,Any &); template <> Swap<job> (job &,job &);//显示具体化

C++Premer Plus学习(五)——函数探幽的更多相关文章

  1. PostgreSQL学习手册(五) 函数和操作符

    PostgreSQL学习手册(五) 函数和操作符 一.逻辑操作符:    常用的逻辑操作符有:AND.OR和NOT.其语义与其它编程语言中的逻辑操作符完全相同. 二.比较操作符:    下面是Post ...

  2. Android JNI学习(五)——Demo演示

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  3. ZigBee学习五 无线温度检测

    ZigBee学习五 无线温度检测 1)修改公用头文件GenericApp.h typedef union h{ uint8 TEMP[4]; struct RFRXBUF { unsigned cha ...

  4. Python基础学习五

    Python基础学习五 迭代 for x in 变量: 其中变量可以是字符串.列表.字典.集合. 当迭代字典时,通过字典的内置函数value()可以迭代出值:通过字典的内置函数items()可以迭代出 ...

  5. JavaScript学习09 函数本质及Function对象深入探索

    JavaScript学习09 函数本质及Function对象深入探索 在JavaScript中,函数function就是对象. JS中没有方法重载 在JavaScript中,没有方法(函数)重载的概念 ...

  6. TweenMax动画库学习(五)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  7. C++学习之函数指针

     C++学习之函数指针          和数据项类似,函数也有地址,函数的地址是存储在机器语言代码的内存的开始地址.通常,这些地址对用户而言,不重要也没什么用处,但对程序而言,它却很有用. 一.函数 ...

  8. Javascript学习5 - 函数

    原文:Javascript学习5 - 函数 在Javascript中,函数和对象是交织在一起的.有些函数的特性与对象相关联.这一点的内容在第六部分会讨论到. 这一部分主要讨论函数与其它比较熟悉的语言( ...

  9. SVG 学习<五> SVG动画

    目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...

  10. 《C++ Primer Plus》读书笔记之六—函数探幽

    第八章 函数探幽 1.常规函数与内联函数的主要区别不在于编写方式,而在于C++编译器如何将它们组合到程序中. 2.常规函数调用使程序跳到另外一个地址(函数地址),并在函数结束时返回,更详细的的实现过程 ...

随机推荐

  1. apache配置多个虚拟主机

    设置apache 多个虚拟目录记录 #配置第2个虚拟目录<VirtualHost 127.0.0.2:80>ServerName www.xx.comDocumentRoot " ...

  2. Swift Tour 随笔总结 (1)

    let Constant var Variable let implicitInteger = 70 let implicitDouble = 70.0 let explicitDouble: Dou ...

  3. Android学习笔记之打钩显示输入的密码

    利用EditText作为密码输入框是个不错的选择(只需设置输入类型为textPassword即可),保密且无需担心被盗取.但有时用户也不知道自己输入的是否正确,这时就应该提供一个“显示密码”的复选框, ...

  4. 淘宝(阿里百川)手机客户端开发日记第七篇 Service,Handler和Thread

    现在我们已经已经知道android有Service,Handler和Thread这些内容了,但是我想应该还有很多人对此并不是很清楚他们之间的区别! (1)Service 是运行在后端的程序,不与UI直 ...

  5. 安装 openSUSE Leap 42.1 之后要做的 8 件事

    导读 openSUSE Leap 确实是个巨大的飞跃,它允许用户运行一个和 SUSE Linux 企业版拥有同样基因的发行版.和其它系统一样,为了实现最佳的使用效果,在使用它之前需要做些优化设置. 下 ...

  6. 在C/C++程序里打印调用栈信息

    我们知道,GDB的backtrace命令可以查看堆栈信息.但很多时候,GDB根本用不上.比如说,在线上环境中可能没有GDB,即使有,也不太可能让我们直接在上面调试.如果能让程序自己输出调用栈,那是最好 ...

  7. c++ exports def文件

    https://msdn.microsoft.com/zh-cn/library/hyx1zcd3(v=vs.80).aspx EXPORTS 引入了一个由一个或多个 definitions(导出的函 ...

  8. 同时运行多个scrapy爬虫的几种方法(自定义scrapy项目命令)

    试想一下,前面做的实验和例子都只有一个spider.然而,现实的开发的爬虫肯定不止一个.既然这样,那么就会有如下几个问题:1.在同一个项目中怎么创建多个爬虫的呢?2.多个爬虫的时候是怎么将他们运行起来 ...

  9. ASP.NET MVC 入门系列教程

    ASP.NET MVC 入门系列教程 博客园ASP.NET MVC 技术专题 http://kb.cnblogs.com/zt/mvc/ 一个居于ASP.NET MVC Beta的系列入门文章,有朋友 ...

  10. C++类编程(一)const的使用

    设计类时,考虑以下五点 1.构造函数初始化列表 2.函数该不该加const 3.参数传递尽量考虑用引用传递,考虑加不加const 4.返回用不用引用 5.数据尽量放在private,函数尽量放在pub ...